sincronizacao-e-armazenamento-offline-first
Sincroniza bases SQLite com indice vetorial entre dispositivos usando Delta-State CRDTs e resolucao LWW offline-first.
Files1
View on GitHubSKILL.md.agents/skills/sincronizacao-e-armazenamento-offline-first/SKILL.md
GitHubsincronizacao-e-armazenamento-offline-first
Descrição
A skill sincronizacao-e-armazenamento-offline-first especifica as rotinas de persistência e sincronização de dados relacionais e vetoriais em ambientes sem conexão (offline-first). Ela garante a replicação incremental de deltas de dados lógicos e busca híbrida distribuída, mantendo o banco de dados SQLite local dos aplicativos desktop/web sincronizado com o servidor remoto sem corromper alterações e sem substituir arquivos brutos do banco de dados.
Quando usar
Gatilhos concretos e observáveis:
- O aplicativo detecta perda ou retorno de conexão com a internet (eventos
online/offlinedo navegador ou sistema operacional). - Ocorre alteração local de dados (digitação de texto, movimentação no Kanban, atualização de ficha na wiki) necessitando salvar em background.
- O sistema realiza rotinas de sincronização periódica programada (cron job em background).
Quando NÃO usar:
- Para transmissão em tempo real tecla-a-tecla (digitação colaborativa ativa no mesmo parágrafo - nesses casos usar a skill
concorrencia-editor-texto-rico-crdt). - Para exclusão definitiva lógica de blocos físicos sob a LGPD (Hard-Delete).
Pré-requisitos
- Banco de dados relacional e vetorial local (SQLite + SQLite-VSS) instalado nos dispositivos clientes.
- Sistema de controle de versão lógica por mutações (clocks de vetor lógicos).
- Conexão e autenticação com servidor central na nuvem configurada.
Processo (passo a passo executável)
- Gravação Local de Mutações (Offline Write):
- Quando o usuário faz alterações em modo offline, gravar as ações na tabela de mutações local (
mutation_log) contendo a query SQL executada, a chave de versão lógica do registro e a alteração dos metadados. - Salvar localmente no arquivo SQLite físico do usuário na máquina.
- Quando o usuário faz alterações em modo offline, gravar as ações na tabela de mutações local (
- Delta-State CRDT Synchronization (Ao Reconectar):
- Ao detectar o retorno de sinal de internet, abrir um canal seguro com a API de sincronização do servidor.
- Computar o vetor de estado local (versão atual do banco do cliente) e enviar ao servidor.
- O servidor responde enviando apenas a diferença lógica (deltas de transações) ocorridas no banco remoto que o cliente ainda não possua.
- Aplicar os deltas sequencialmente na base SQLite local dentro de blocos de transações protegidos (
BEGIN TRANSACTION ... COMMIT).
- Resolução de Conflitos Last-Write-Wins (LWW):
- Se ocorrer edição simultânea do mesmo campo (ex: Usuário A editou o nome da espada no dispositivo offline 1; Usuário B editou o nome da mesma espada no dispositivo online 2):
- Comparar os timestamps físicos (sincronizados via NTP) e clocks de vetor lógicos.
- A alteração com o timestamp mais recente vence e é persistida. A perdedora é descartada ou arquivada em tabela de histórico secundária de reconciliação.
- Se ocorrer edição simultânea do mesmo campo (ex: Usuário A editou o nome da espada no dispositivo offline 1; Usuário B editou o nome da mesma espada no dispositivo online 2):
- Distribuição de QoS de Busca Híbrida (Princípio VELO):
- Monitorar a carga de CPU/GPU e consumo de bateria do dispositivo cliente.
- Se o hardware estiver sobrecarregado ou sem aceleração de GPU local, executar a busca vetorial densa na máquina cliente (borda) e terceirizar as requisições de geração de resumos ou GraphRAG longas ao servidor remoto na nuvem, otimizando o consumo de energia e mantendo a latência estável.
Parâmetros e configuração
SYNC_RETRY_INTERVAL_SECONDS: Tempo de espera para tentar restabelecer sincronização em caso de queda de rede no meio da transação. Padrão:15.MAX_BATCH_MUTATIONS_SIZE: Quantidade máxima de queries enviadas em um único lote (batch) de sincronização. Padrão:100.NTP_SYNC_TOLERANCE_MS: Tolerância máxima aceitável de dessincronização de relógio físico entre cliente e servidor. Padrão:500(ms).
Armadilhas e como evitá-las
- Armadilha: Sobrescrita de Arquivo de Banco de Dados Físico: substituir de forma integral o arquivo SQLite do cliente (
romance.db) baixando a versão do servidor em background. Isso apaga instantaneamente todas as modificações offline feitas pelo escritor no dispositivo, gerando perda irreversível de dados. Mitigação: Proibir a substituição ou download direto do arquivo de banco de dados do servidor durante o uso. A replicação e atualização devem ser feitas estritamente em nível de transações de dados lógicos e logs de mutação incrementais de forma atômica (Kleppmann et al., 2019).
Critérios de validação (Definition of Done)
- A sincronização incremental em lote atinge 100% de consistência sem corromper registros lógicos sob simulações de desligamento abrupto de rede no meio da transmissão.
- O banco de dados local SQLite permanece responsivo e operacional para leitura/escrita com latência zero sob falha de internet.
Fundamentação científica
- Shapiro, M. et al. (2011) - Conflict-Free Replicated Data Types - DISC 2011
- Kleppmann, M. et al. (2019) - Local-first Software: You own your data, in spite of the cloud - IEEE Software
- VELO (2024) - A Vector Database-Assisted Cloud-Edge Collaborative LLM QoS Optimization Framework - arXiv 2024
Requisitos do projeto relacionados
- RF-127 (sincronização offline)
- RF-90 (sincronização de dados)
Maturidade e riscos de adoção
Nível: Consolidada. A engenharia de replicação de dados baseada em transações e reconciliações LWW em bancos locais leves (SQLite) é amplamente difundida e madura no ecossistema mobile e desktop.
Exemplos
Entrada (Log de mutações offline a sincronizar):
{
"client_id": "client_123",
"vector_clock": {"client_123": 4, "server": 2},
"mutations": [
{"table": "personagens", "action": "UPDATE", "fields": {"id": "char_kael", "idade": 31}, "timestamp": 1783948500}
]
}
Saída esperada (Confirmação de Sync):
{
"status": "SUCCESS",
"applied_mutations": 1,
"server_vector_clock": {"client_123": 4, "server": 3}
}
Caso de falha conhecido: Duplicar linhas no banco de dados central do servidor após reconexão devido a falhas no rastreamento de IDs lógicos dos registros.