# Eventos

> O registro da estação sobre o que aconteceu: linhas do tempo persistentes de alarmes, ocorrências e intertravamentos ao lado do console de diagnóstico ao vivo, com busca, filtros e exportação CSV/JSON.

Eventos é a página que responde "o que aconteceu?". Ela fica no grupo do pé do trilho de navegação
(Validação, Eventos, Agente, Configurações, Conta) e tem quatro abas: **Alarmes**, **Ocorrências** e
**Intertravamentos** são linhas do tempo persistentes lidas do diário de eventos da estação, e
**Console** é o feed de diagnóstico ao vivo em que todo subsistema escreve. O cabeçalho da página diz
"Históricos permanentes de alarmes, ocorrências e intertravamentos, e o console de diagnóstico ao
vivo."

Ver a página exige a permissão **Ver eventos** (área Sistema): tanto a entrada do trilho quanto o
endereço `/events` dependem dela. Todo papel de fábrica a tem por padrão, "Não conectado"
incluído, e o Admin sempre a tem; um papel criado em branco começa sem ela, e um administrador pode
removê-la de qualquer papel que não seja o de administrador. Exportar a partir de qualquer aba exige
**Exportar/importar históricos** além dela.

## As abas e seus endereços {#the-tabs-and-their-addresses}

| Aba | O que lista | Endereço | Página |
| --- | --- | --- | --- |
| Alarmes | Os alarmes que aguardam agora, sobre a linha do tempo persistente das transições de estado de alarme | `/events?view=alarms` | [Alarmes](events-alarms) |
| Ocorrências | Toda aresta de ocorrência observada durante uma execução ou pelo vigia do modo Sempre fora de execução | `/events?view=occurrences` | [Ocorrências](events-occurrences) |
| Intertravamentos | Toda transição da trava de intertravamento de uma unidade | `/events?view=interlocks` | [Intertravamentos](events-interlocks) |
| Console | As 500 entradas de diagnóstico mais recentes do programa em execução | `/events?view=console` | [Console](events-console) |

A página abre em Alarmes. Clicar numa aba reescreve o endereço (substituindo-o, para que a faixa de
abas nunca encha a pilha de voltar do navegador), e um link que carrega `view=` cai naquela aba; um
valor que a página não conhece a deixa abrindo em Alarmes. É assim que o indicador de alarme da
barra de status (o sino com "N ativos (M não reconhecidos)", desenhado apenas enquanto um alarme
está ativo ou aguardando reconhecimento) chega à lista de alarmes: ele navega para
`/events?view=alarms`, a tela onde o que ele conta é ao mesmo tempo lido e respondido, nunca a
página Logic, onde os alarmes são configurados.

O Console fica montado atrás das outras abas, então o estado de acompanhar o fim e a posição de
rolagem sobrevivem a uma troca; cada uma das três linhas do tempo mantém a sua própria busca, o seu
filtro, as suas linhas e a sua seleção enquanto você circula entre elas.

## Quem pode ver e exportar {#who-can-see-and-export}

| Permissão | O que ela abre nesta página | Sem ela |
| --- | --- | --- |
| Ver eventos | A entrada do trilho, o endereço e todas as abas | A entrada não é desenhada e o endereço é recusado |
| Exportar/importar históricos | **Exportar** em toda aba (CSV, JSON) e **Criar pacote de suporte** no Console | O botão Exportar não é desenhado; um acionamento que ainda assim chegue ao tratador responde "Exportar eventos exige a permissão Exportar/importar históricos." no feed de ações |
| Operar a lógica | **Reconhecer** e **Reconhecer todos** na aba Alarmes | Os verbos não são desenhados; as linhas continuam legíveis |
| Alterar configurações | **Iniciar a captura** e **Parar a captura** no Console | O botão não é desenhado; o estado da captura continua sendo anunciado aos leitores de tela |

As permissões são decididas por conexão, então um circuito de navegador autenticado como outro
usuário vê o seu próprio conjunto de botões, e entrar, sair ou editar um papel os redesenha na hora.
O catálogo está em [Permissões](users-permissions).

## Como as três linhas do tempo se comportam {#how-the-three-timelines-behave}

As abas Alarmes, Ocorrências e Intertravamentos compartilham uma conduta só, de modo que trocar de
aba nunca muda as regras:

| Comportamento | Detalhe |
| --- | --- |
| Janela | Cada aba lista 500 eventos por página, os que casam com a sua busca, o seu filtro e o período escolhido, do mais novo para o mais antigo (um empate no instante é desfeito pela ordem de inserção). Sob a lista, **Mais recentes** e **Mais antigos** percorrem o resto do diário, uma página de cada vez, e a faixa só é desenhada enquanto há outra página a alcançar. A página mais nova acompanha o diário ao vivo; uma página atrás dela fica parada, de modo que um evento que chega agora não empurra para baixo o que você está lendo. |
| Período | Duas caixas de data, **De** e **Até**, cada uma um extremo do período lido. Uma caixa vazia não é limite nenhum, então deixar as duas vazias lê o diário inteiro, e o dia escolhido como limite final entra inteiro, até o seu último instante. O xis ao lado delas limpa o par e devolve a aba à primeira página. |
| Busca | Uma caixa de texto cujo texto de exemplo nomeia as colunas em que ela casa (nome, mensagem, origem, modelo, unidade, procedimento, autor, conforme a aba). O casamento é "contém", sem diferenciar maiúsculas, aplicado 250 ms depois que você para de digitar; espaços no início e no fim são ignorados. |
| Filtro de nível | Uma lista por aba: **Prioridade** em Alarmes, **Severidade** em Ocorrências, **Transição** em Intertravamentos. Mudá-la relê o diário na hora. |
| Atualizar | O botão de seta circular relê o diário sob demanda; a sua dica nomeia a aba ("Atualizar eventos de alarme", "Atualizar ocorrências", "Atualizar eventos de intertravamento"). Ele fica cinza enquanto uma leitura corre. |
| Atualização ao vivo | Todo evento gravado no diário reconsulta a aba aberta sozinho, agrupado para que uma rajada custe uma leitura só (cerca de 200 ms depois da última gravação). Uma aba que você não está olhando é relida quando você volta a ela. |
| Seleção | Clicar numa linha abre o painel de detalhes à direita. A seleção é mantida entre atualizações pelo id do evento e descartada se a linha não estiver na página lida; o xis no cabeçalho do painel o fecha. |
| Copiar evento | O botão no pé do painel de detalhes copia o evento como uma linha de texto: instante completo, tipo, nível, nome, o resumo da transição, a mensagem e, para ocorrências e intertravamentos, as identidades. O feed de ações responde "Evento copiado para a área de transferência." ou "A área de transferência recusou a cópia." quando o navegador a negou. |
| Exportar | **Exportar** abre um menu com **Exportar como CSV…** e **Exportar como JSON…** para todo evento que a busca, o filtro e o período alcançam, página após página, e não só as linhas desenhadas. O botão fica cinza enquanto a página está vazia. |
| Registro sem filtro | O diário não é filtrado por quem está autenticado nem pelo que aquele papel pode ver em outro lugar: ele é o registro técnico da estação, e uma linha faltando em silêncio faria o histórico mentir. |

### A lista e o painel de detalhes {#the-list-and-the-detail-panel}

Toda linha carrega a data e a hora do evento no formato configurado em
[Idioma e formatos](settings-localization), um ponto no tom do seu nível, o nome do evento, um
resumo de uma linha da transição e, na borda direita, a palavra do próprio nível (a prioridade, a
severidade ou a transição). Os tons seguem uma escala só em toda superfície: o tom crítico para um
alarme Crítico, uma ocorrência Crítica ou o disparo de um intertravamento; o tom de cautela para
Alta, Alerta e "Origem segura"; o tom de atenção para Média; neutro para o resto.

O painel de detalhes abre com o distintivo do nível e o nome, depois o instante completo com
milissegundos, o resumo da transição, a mensagem (ou "Nenhuma mensagem capturada." quando a
definição não tinha nenhuma), um cartão **EVENTO** com **Nível** e **ID do evento**, e um ou mais
cartões de snapshot cujos campos a página de cada aba lista.

### A linha de status {#the-status-line}

Sob toda linha do tempo: "N mostrados · página 1", em que N conta as linhas da página aberta,
seguido de " · filtrado" enquanto uma busca, um filtro de nível ou um período está em vigor;
"N mostrados · atualizando…" durante uma releitura; à direita, "1
selecionada" enquanto uma linha está selecionada e "Atualizado hh:mm:ss", a hora da última leitura
bem-sucedida.

### Estados de carga, vazio e falha {#loading-empty-and-failed-states}

| Estado | O que a aba mostra |
| --- | --- |
| Primeira leitura | "Carregando eventos de alarme…" com "Lendo do diário permanente os eventos de alarme mais recentes que combinam." (o substantivo acompanha a aba). |
| Nada gravado | "Nenhum evento de alarme ainda" com uma frase dizendo o que vai aparecer ali; a página de cada aba cita a sua. |
| Nada casa | "Nenhum registro de eventos de alarme combina com estes filtros" com "Ajuste o filtro de prioridade ou os termos de busca para ampliar este histórico." (prioridade, severidade ou transição, conforme a aba). |
| O diário não pode ser lido | "Não foi possível carregar os alarmes" com "O diário permanente está temporariamente indisponível. Os registros do console não são afetados." e um botão **Tentar de novo**; a linha de status diz "Alarmes indisponíveis". |
| Uma atualização posterior falha | As últimas linhas boas continuam na tela e o feed de ações informa "A atualização de Alarmes falhou." |

## Exportar uma linha do tempo {#exporting-a-timeline}

Os dois formatos são downloads do navegador, então funcionam igualmente na janela da própria estação
e num navegador remoto; o feed de ações responde "Exportados N eventos para" seguido do nome do
arquivo, ou "A exportação falhou.". O
nome do arquivo carrega a aba e um carimbo ordenável: `alarm-history-20260902-143000.csv`,
`occurrence-history-<stamp>.json`, `interlock-history-<stamp>.csv`.

Todo instante é escrito no formato de exibição configurado, e o arquivo declara a referência de
tempo uma vez: o CSV a nomeia no cabeçalho da sua primeira coluna, "Timestamp (UTC-03:00)" (ou
"Timestamp (UTC)"), e o JSON é um envelope com um campo `TimeZone` no topo, ao lado de um vetor
`Events`. Além do que a linha mostra, as colunas carregam o snapshot congelado inteiro, identidades
incluídas (o id do evento, os ids do alarme, da ocorrência ou da observação, os ids do modelo e da
unidade), de modo que uma linha do tempo exportada pode ser correlacionada com arquivos de execução
e relatórios. Uma célula de CSV que começa com `=`, `+`, `-` ou `@` recebe um apóstrofo na frente
para que a planilha a abra como texto e não como fórmula. A página de cada aba lista as suas
colunas.

## O que o diário guarda {#what-the-journal-keeps}

As três linhas do tempo vivem em `events.db`, um banco só delas na pasta de dados da estação, ao
lado de `config.db` e `history-index.db`, com uma tabela somente de acréscimo por linha do tempo. O
que é escrito é um snapshot tirado no instante do evento (nomes, prioridade, mensagem, modelo,
unidade, origem, o valor observado), então renomear, editar ou excluir a definição depois nunca
reescreve o que a estação lhe disse na hora. Nada nesta página, nem em qualquer outro lugar da
aplicação, exclui uma linha: a retenção guarda as **100.000 linhas mais recentes por linha do
tempo**, podando as mais antigas pela ordem de inserção a cada acréscimo, de modo que um relógio
corrigido não possa despejar um evento novo.

O diário sobrevive a um reinício e à restauração de uma configuração: um [backup](settings-backups)
copia apenas o banco de configuração e a pasta de recursos, então restaurá-lo não leva o diário junto
nem o faz voltar no tempo. Ele é um registro de transições, não de estado: depois de um reinício o
registro de alarmes rededuz todo alarme a partir da primeira varredura, os reconhecimentos que
estavam pendentes se perdem, e a linha do tempo simplesmente mostra o que aconteceu antes e depois.

Os eventos chegam ao diário por uma fila ordenada que nunca bloqueia o runtime: o produtor tira o
snapshot na hora, um único escritor grava na ordem de chegada, e uma gravação que continua falhando
é repetida até dez vezes antes de o evento ser descartado com uma linha de Error no Console. Uma
ocorrência observada **durante uma execução** é escrita primeiro no arquivo daquela execução (a
fonte que Históricos e relatórios leem) e depois copiada para o diário com o mesmo id de evento e o
contexto da execução; uma observação feita **fora de execução** por uma ocorrência do modo Sempre vai apenas
para o diário. Transições de intertravamento e de alarme não têm registro nenhum além do diário. Um
agente com a área Logs aberta lê esse mesmo diário por `event_history_read`, somente leitura (veja
[Áreas permitidas](agent-areas)).

## O console ao lado do registro {#the-console-beside-the-record}

O Console é coisa diferente das três linhas do tempo: uma visão rotativa de 500 entradas do fluxo de
diagnóstico do programa, em memória, perdida no reinício e esvaziada por **Limpar a visão**. Os dois
se sobrepõem onde o runtime narra o que está fazendo. Uma aresta de ocorrência deixa uma linha no
Console sob a área Process (uma ativação no nível da sua severidade: Crítica como erro, Alerta como
alerta, Informação como informação), e uma transição de intertravamento também (um disparo como
alerta, uma origem segura e um rearme como informação). Transições de alarme **não** aparecem no
Console: o rastro do avaliador é detalhe de diagnóstico que só uma
[captura detalhada](events-console#detailed-capture) grava. As linhas do tempo são o registro
tipado; o Console explica o runtime em volta dele.

## O que Eventos não faz {#what-events-does-not-do}

- Ele não configura nada. Alarmes são definidos em [Logic > Alarms](logic-alarms), ocorrências em
  [Process > Preparação > Ocorrências](process-occurrences) e o intertravamento de parada em
  [Process > Definição > Automação](process-automation).
- Ele não rearma intertravamento nenhum: isso é o componente Intertravamento de um dashboard ou a
  própria visão da unidade.
- Ele não tem filtro por unidade ou por execução: busque pelo nome, ou abra a
  execução em [Históricos](histories) para ver o registro de ocorrências dela.
- Ele não exclui nada e não edita nada; só a retenção remove linhas.
- Enquanto o runtime está parado esta página não é desenhada de jeito nenhum: toda tela exceto
  [Conta](account) é substituída pelo aviso de pausa, as linhas do tempo inclusive. O diário em si
  fica intocado e é lido exatamente como antes assim que o runtime é reiniciado.
