“Session Not Found”? O state.db agora detecta, quarenteniza e se cura sozinho

Você abre o Hermes para recuperar a sessão de ontem e leva um seco session not found — mas você lembra claramente que ela existe. Pior: o state.db (o banco SQLite onde o Hermes guarda todo o histórico de sessões) é corrompido por completo e meses de conversas “desaparecem”. No passado, essa classe de problema era quase impossível de diagnosticar: a mensagem de erro escondia a causa real (corrupção do banco), e o sistema continuava escrevendo no banco quebrado, fazendo o estrago virar uma bola de neve. Um lote de correções mesclado em 30-31 de agosto (PR #99513 e seus PRs irmãos) dá ao Hermes, pela primeira vez, uma forma sistemática de lidar com corrupção de banco: detectá-la, quarentenizar o arquivo ruim, curar o que pode ser curado e dizer claramente quando não dá.
Por que era tão difícil diagnosticar antes
O state.db é um arquivo SQLite — robusto na teoria, mas ainda assim corrompível após queda de energia, disco cheio, processo travado ou aberturas concorrentes de múltiplos processos. No passado, a atitude do Hermes diante da corrupção era “fingir que nada aconteceu”:
- Ao ler dados ruins, a UI só mostrava
session not found, engolindo o fato de que “o banco de dados está corrompido”; - Um banco estruturalmente quebrado continuava aceitando escritas — dados novos despejados num armazém quebrado, como encher um balde furado;
- Um arquivo vazio de 0 bytes era confundido com um “banco recém-criado” e aberto normalmente — até a primeira escrita real falhar com
attempt to write a readonly database; - Com vários processos abrindo o mesmo banco, um processo podia classificar como corrompido o banco vazio que outro processo acabara de criar legitimamente e quarentenizá-lo.
O que este lote corrige
Seis PRs, abrangendo quatro fases: detecção, quarentena, cura e proteção.
Detectar corrupção em vez de fingir
- Reportar “corrupção” em vez de “session not found” (PR #99529): a detecção de corrupção entra no caminho de leitura, então o problema aparece com uma mensagem clara em vez de um erro enganoso;
- Bancos estruturalmente corrompidos param de aceitar escritas (PR #99652): fail-closed — recusar escritas em vez de despejar dados num armazém quebrado;
- Conexões de leitura são limitadas por arquivo, não por instância de SessionDB (PR #98691): antes cada instância tinha seu próprio orçamento de conexões, então a contagem de conexões disparava com várias instâncias — um gatilho para esgotamento de file descriptors e travamentos.
Quarentenizar arquivos de 0 bytes
- Um state.db truncado de 0 bytes é quarentenizado (PR #98017): o arquivo vazio é movido para o lado na inicialização em vez de ser aberto como um banco normal;
- Lock entre processos corrige a corrida da quarentena (PR #99513, sub-cluster A): toda a sequência check → quarantine → connect → schema-commit roda agora sob um lock entre processos, com uma proteção
has_live_connection()resguardando bancos “vazios, mas legitimamente em uso” — um processo não consegue mais quarentenizar o banco recém-criado de um irmão.
Autocura do índice FTS de texto completo
- UnicodeDecodeError não quebra mais a sondagem do índice (PR #99513, sub-cluster B): tabelas corrompidas de busca full-text (FTS) podem lançar erros de decodificação, que antes matavam a inicialização somente leitura e todos os endpoints de leitura atrás dela; as sondagens e os caminhos de cura agora capturam esses erros, e tabelas FTS quebradas são descartadas e recriadas.
Eliminar corridas da classe de crash
- Leituras não sincronizadas na conexão de escrita compartilhada acabaram (PR #99502): essa classe podia causar crashes no nível de SIGSEGV em casos extremos;
- Corridas entre close() e escritas em segundo plano se autocuram (PR #99509): quando a conexão de escrita fecha com escritas ainda em voo, o sistema se repara em vez de descartar dados em silêncio.
O que isso significa para você
Se o seu histórico de sessões já “desapareceu misteriosamente”, este lote muda todo o pipeline de tratamento: detecção na frente → quarentena do arquivo ruim → cura do que é curável (tabelas FTS) → e quando não dá para curar, um erro claro — sem nunca continuar escrevendo no armazém quebrado. A confiabilidade dos dados de sessão passa de “pode desaparecer um dia” para “no mínimo o problema está explicado e o estrago para de crescer”.
Quando você pode usar
Esses PRs foram mesclados em 30-31 de agosto de 2026 e estão todos apenas na main — ainda não saíram em uma release. Atualize para a main mais recente para obter a proteção completa; se você já levou um session not found ou perdeu sessões antes, vale reler as mensagens de erro depois de atualizar — elas agora dizem o estado do banco diretamente.
Seu histórico de sessões é a memória de trabalho entre você e o Hermes — sua confiabilidade merece cuidado. Para outras formas de proteger dados de sessão, veja o guia de salvar e exportar sessão e o postmortem da amnésia de 798 mensagens; como a compressão interage com o histórico está coberto no guia de compactação em uma chamada.