# Persistência

> Como um serviço LMSP armazena seu estado, com um banco SQLite embutido, as tabelas a manter, as regras transacionais para tarefas e eventos, a retenção e a recuperação na inicialização.

Source: https://madeforagent.com/pt-br/lmsp/1.0/persistence/
Language: pt-BR
Specification: LMSP 1.0 (draft)
Updated: 2026-11-08

## 11.1 Armazenamento {#storage}

Um serviço **DEVERIA** manter seu estado em um banco de dados [SQLite](https://www.sqlite.org/) embutido. Um conjunto sugerido de tabelas:

| Tabela | Conteúdo |
| --- | --- |
| `service_config` | Identidade e configuração do serviço. |
| `clients` | Clientes pareados, hashes de tokens e escopos. |
| `models` | Metadados de modelos e digests de conteúdo. |
| `responses` | Respostas armazenadas. |
| `tasks` | Tarefas assíncronas. |
| `task_events` | O log de eventos de cada tarefa, com números de sequência. |
| `idempotency_keys` | Chaves de idempotência, digests de requisições e resultados. |

Os arquivos de modelo **DEVEM** ficar fora do banco de dados. O banco guarda apenas metadados e digests de conteúdo.

Os nomes e a organização das tabelas são uma escolha de implementação. O que os clientes podem observar, e o que precisa ser interoperável, é o comportamento descrito nas próximas duas seções.

## 11.2 Regras {#rules}

Seja qual for o armazenamento que um serviço use, ele:

- **DEVE** persistir uma tarefa antes de retornar `202 Accepted`.
- **DEVE** atualizar os números de sequência dos eventos e o status da tarefa na mesma transação.
- **DEVE** tornar atômica a transição de cancelamento, para evitar a condição de corrida de uma tarefa que é cancelada e depois concluída.
- **DEVERIA** manter as tarefas e os eventos concluídos por um período de retenção configurável.
- **NÃO DEVE** excluir tarefas inacabadas durante a limpeza de logs.
- **DEVE**, na inicialização, varrer as tarefas `queued`, `loading`, `running` e `cancelling` que restaram e aplicar a política de reinicialização de cada uma ([seção 7.5](https://madeforagent.com/pt-br/lmsp/1.0/tasks.md#restart)).

## 11.3 Recuperação na inicialização {#recovery}

A tabela mostra o estado para o qual uma tarefa remanescente é movida, de acordo com a sua política `on_restart`:

| Estado encontrado na inicialização | `fail` | `retry` | `resume` |
| --- | --- | --- | --- |
| `queued` | `failed` | `queued` | `queued` |
| `loading` | `failed` | `queued` | `queued` |
| `running` | `failed` | `queued` | `running`, continuando a partir do snapshot |
| `cancelling` | `cancelled` | `cancelled` | `cancelled` |

Uma tarefa movida para `failed` recebe o código de erro `server_restarted` e um evento `response.failed`. Uma tarefa movida para `cancelled` recebe um evento `response.cancelled`. O novo estado e o seu evento são gravados em uma única transação ([seção 11.2](https://madeforagent.com/pt-br/lmsp/1.0/persistence.md#rules)).
