Pular para conteúdo

Recuperação de dados e quarantine JSON

SQLite é a fonte de verdade para candidaturas, eventos e snapshots. Os stores JSON/JSONL que continuam ativos por compatibilidade usam uma política única de recuperação em modules.storage.json_recovery.

Uma leitura inválida nunca retorna estado vazio. O arquivo original é movido para .quarantine, um marcador sem conteúdo pessoal registra apenas tipo de erro, data e caminho, e o store passa a degraded. Enquanto esse marcador existir, leituras e gravações são bloqueadas para impedir que um estado novo sobrescreva dados recuperáveis.

Gravações válidas usam um arquivo temporário com nome único, fsync, replace atômico e até três backups rotativos em .backups. A regra está aplicada ao Perfil Universal, histórico legado do Tracker, Companion, Radar, scheduler e repositórios JSON/JSONL de compatibilidade.

Diagnóstico e restore explícito

O diagnóstico é somente leitura:

python scripts/check_data_health.py

Um marcador degraded aparece como json_store_degraded e faz o comando sair com erro. Escolha manualmente um backup conhecido e valide-o antes de restaurar:

python scripts/restore_json_store.py data/profile/profiles.json \
  data/profile/.backups/profiles.json.TIMESTAMP.bak

python scripts/restore_json_store.py data/profile/profiles.json \
  data/profile/.backups/profiles.json.TIMESTAMP.bak --apply

Para JSONL, acrescente --jsonl. O restore valida o conteúdo, grava de forma atômica e somente então remove o marcador degraded. A quarantine permanece como evidência recuperável até uma limpeza manual consciente.