sincronizacao-banco-dados-local-first
Sincroniza dados relacionais estruturados (fichas, cronogramas) offline-first entre IndexedDB e PostgreSQL sem conflitos.
SKILL.md.agents/skills/sincronizacao-banco-dados-local-first/SKILL.md
GitHubsincronizacao-banco-dados-local-first
Descrição
A skill sincronizacao-banco-dados-local-first implementa a sincronização bidirecional e offline-first de dados relacionais complexos estruturados (como fichas de lore, cronogramas de escrita e outlines de capítulos). Ela garante a fusão automática de atualizações concorrentes feitas em IndexedDB local e no servidor PostgreSQL remoto sem perdas de dados e sem exigir resolução de conflitos manuais pelo escritor.
Quando usar
Gatilhos concretos e observáveis:
- A aplicação inicia sem conexão com a internet (leitura instantânea de snapshots binários locais do IndexedDB).
- A conexão com a internet é restabelecida após um período de escrita offline (disparado pelo listener de status de rede).
- O escritor reorganiza a árvore de capítulos no editor (arraste de arquivos do outline/Kanban).
Quando NÃO usar:
- Para sincronizar texto corrido enriquecido (nesses casos, utilizar a skill
concorrencia-editor-texto-rico-crdt). - Para chamadas diretas de APIs transacionais de cobrança ou autenticação de conta.
Pré-requisitos
- IndexedDB no navegador ou banco SQLite local no aplicativo desktop.
- Extensão Yjs para mapeamento JSON (
Y.MapeY.Array). - Banco relacional PostgreSQL na nuvem atuando como repositório central.
Processo (passo a passo executável)
- Modelagem de Dados Estruturados em Yjs:
- Mapear a ficha da wiki de personagens/locais como um
Y.Mapcontendo pares de chave-valor. As listas ordenadas (ex: inventário) devem ser estruturadas emY.Array. - Salvar as modificações no banco local IndexedDB instantaneamente sob formato binário compactado.
- Mapear a ficha da wiki de personagens/locais como um
- Algoritmo de Movimentação em Árvore com Prevenção de Ciclos (Move Operation):
- Para drag-and-drop da árvore de capítulos/cenas, usar o algoritmo de movimentação CRDT (princípios Da & Kleppmann, 2023).
- Checagem de Ciclo: Antes de aceitar a operação de re-aninhamento (ex: mover pasta $A$ para dentro da pasta $B$), varrer a hierarquia lógica de pais no cliente. Se $B$ for descendente de $A$, bloquear a alteração na UI para evitar ciclo de órfãos (pastas invisíveis perdidas).
- Replicação Relacional Comutativa (CRR):
- Na reconciliação de dados entre o IndexedDB do cliente e o PostgreSQL do servidor, aplicar o algoritmo Last-Write-Wins-Element-Set baseado em clocks físicos sincronizados (NTP) e clocks de vetor locais.
- Atualizar as linhas da base SQL aplicando as modificações no nível granular de atributo (coluna), não substituindo a linha física inteira, permitindo que o Usuário A edite a idade do personagem e o Usuário B edite a cor dos cabelos simultaneamente sem sobrescrever um ao outro.
Parâmetros e configuração
OFFLINE_SYNC_RETRY_MS: Tempo de espera para tentar nova sincronização sob falha de conexão de rede. Padrão:5000(5 segundos).CONFLICT_RESOLUTION_STRATEGY: Estratégia padrão para conflitos concorrentes de chave-valor idênticas no mesmo instante. Padrão:"LWW"(Last-Write-Wins).
Armadilhas e como evitá-las
- Armadilha: Conflito de Loop por Movimentação: dois autores movendo pastas simultaneamente de forma cruzada (Usuário A move Pasta A para dentro de B; Usuário B move Pasta B para dentro de A concorrentemente). Isso quebra o sistema de arquivos fazendo com que ambas as pastas desapareçam da árvore lógica do projeto por falta de nó raiz válido.
Mitigação: Implementar a lógica de checagem de ciclo na aresta local antes de empacotar a alteração no CRDT. Se a transação recebida do servidor tentar criar uma dependência circular, a operação mais antiga no clock lógico deve prevalecer, e a concorrente mais recente deve ser abortada e redirecionada para a pasta raiz global
[Romance_Root](Da; Kleppmann, 2023).
Critérios de validação (Definition of Done)
- A taxa de resolução de conflitos em fichas relacionais e reordenações de diretórios é de 100% de comutatividade (ambos os clientes convergem para o mesmo estado exato de dados).
- A aplicação inicializa e renderiza dados da wiki em menos de 100ms em modo offline carregando do IndexedDB local.
Fundamentação científica
- Kleppmann, M. & Beresford, A. (2016) - A Conflict-Free Replicated JSON Datatype - IEEE TPDS 2016
- Da, Liang & Kleppmann, M. (2023) - Extending JSON CRDTs with Move Operations - arXiv 2023
- CRR Group (2020) - Conflict-free Replicated Relation: A CRDT for Shared Relational Databases - PaPoC 2020
- Kleppmann, M. et al. (2019) - Local-first Software: You own your data, in spite of the cloud - IEEE Software
Requisitos do projeto relacionados
- RF-2 (reorganização)
- RF-81 (edição concorrente)
- RF-90 (IndexedDB/PostgreSQL sync)
Maturidade e riscos de adoção
Nível: Consolidada. A modelagem JSON CRDT e a sincronização local-first com SQLite/IndexedDB é estável, com diversas implementações consolidadas em frameworks de produção.
Exemplos
Entrada (Edição Concorrente em Ficha de Lore):
- Usuário A atualiza:
ficha_kael.idade = 30(t=1). - Usuário B atualiza:
ficha_kael.cabelo = "cinza"(t=2). - Sincronização remota é restabelecida. Saída esperada (Objeto reconciliado no banco central):
{
"nome": "Kael",
"idade": 30,
"cabelo": "cinza"
}
Caso de falha conhecido: Uma pasta sumir da barra lateral de arquivos após o autor arrastá-la sem sinal de internet ativo.