A PayAna agora possui uma camada estruturada e separada do transcript de conversa. O objetivo é garantir que CONVERSATION_STATE != PROJECT_STATE e que receita, oportunidades, ações e evidências possam ser retomadas sem reconstrução manual.
Tabelas Turso: payana_state, payana_opportunities, payana_economic_events, payana_actions, payana_receipts.
Bridge 0.6.0 adiciona: payana_state_upsert, payana_opportunity_upsert, payana_economic_upsert, payana_action_upsert, payana_receipt_upsert, payana_snapshot.
Estado inicial validado: REV-000001 = USD 0.01, classificado como USER_CONFIRMED_RECEIPT_UNVERIFIED; uma receipt explícita receipt-gap-REV-000001 registra a proveniência ainda ausente em vez de inventar plataforma, transaction ID ou timestamp.
Provas desta branch: schema migration PASS em Turso; seed/readback PASS; snapshot via bridge PASS; invalid decimal, HTTP URL e SHA-256 são rejeitados; regressões V0.4/V0.5/V0.6/V0.7 e release audit permanecem PASS.
Antes de qualquer ingestão de export real, o Vault agora exige preflight em duas etapas:
Somente analisarinicia ligado e não grava no Turso;- o preflight mede conversas, mensagens textuais, mapping, IDs, content types, vazios e limites;
- a liberação para escrita é vinculada a
sourceFingerprint + limite selecionado; - trocar arquivo ou 25/50/100/.../completo invalida a liberação;
- após conclusão ou replay já COMPLETE, o modo seguro é reativado;
- ZIP64 seletivo é suportado, com multidisk e inteiros acima do limite seguro bloqueados;
- anexos são inventariados, não ingeridos nesta etapa.
Provas pré-merge: v07_preflight_selftest.ts = PASS com sameDbBeforeAfter=true; gate same-scope=true/different-limit=false/different-fingerprint=false; v07_zip64_selftest.ts = PASS; V0.6 e V0.5 regression PASS; release audit PASS; /api/stats anônimo = 401.
Status de promoção: ZIP_SYNTHETIC_VERIFIED; export oficial real ainda UNVERIFIED.
Novidades:
- aceita ZIP do export ou
conversations*.jsondiretamente; - leitor ZIP seletivo lê diretório central + somente entradas de conversa, sem
file.arrayBuffer()do ZIP inteiro; - suporta ZIP clássico com STORE/DEFLATE, valida tamanho e CRC32 e bloqueia ZIP criptografado, multidisk e ZIP64 por enquanto;
- inventaria arquivos não ingeridos sem interpretá-los como conversa;
- fingerprint baseado no conteúdo dos JSONs de conversa, estável mesmo após renomear/baixar novamente o mesmo export;
- cursor persistente
vault_import_runsno Turso com estados IN_PROGRESS/PAUSED/COMPLETE/FAILED; - conversa + mensagens + FTS + avanço do cursor são confirmados no mesmo batch transacional; replay do mesmo cursor não duplica
indexed_messages; - timeout/erro transitório após write força reconciliação do run; se a reconciliação também falhar, o cliente entra em
UNKNOWN_EXTERNAL_STATEe não repete cegamente; - run id escopado pelo tamanho selecionado (25/50/100/.../completo), evitando cursor incoerente ao ampliar a ingestão;
- deduplicação por conversation id antes do cursor, mantendo a versão com maior
update_time; itens sem ID não são deduplicados automaticamente para evitar perda por falso positivo; - UI mostra inventário, duplicatas removidas e cursor persistido.
Evidência automática:
v06_selftest.ts: ZIP DEFLATE sintético particionado, leitura seletiva, CRC corruption, ZIP sem conversations, fingerprint, deduplicação e PAUSED→COMPLETE;v05_selftest.ts: regressão V0.5;v06_release_audit.ts: Turso/queue/resíduos antes da promoção;/api/import-runs/...sem sessão: HTTP 401.
Limites deliberados:
- ZIP64 ainda bloqueado; não chamar de compatível com exports >4 GiB até implementar/testar ZIP64;
- assets/PDFs/imagens são apenas inventariados nesta versão;
ZIP_SYNTHETIC_VERIFIED != REAL_CHATGPT_EXPORT_VERIFIED.
Status antes do merge: backend/bridge verificado em Turso.
Novidades:
vault_knowledge_items+ FTS5 para regras, decisões, lições, arquitetura, riscos e achados estruturados;vault_relationspara relações graph-lite entre knowledge/checkpoint/conversation/entity/project/artifact/concept;- bridge actions
knowledge_upsert,get_knowledge,related; search_hybrid: ChatGPT gera variantes conceituais; backend executa FTS5/BM25 e Reciprocal Rank Fusion, sem chamar API de IA;- filtros de projeto/kind estritos;
- knowledge writes idempotentes por ID e seguros contra stale retry;
- relação inválida falha antes de persistência;
- UI mostra conhecimento estruturado e relações.
Evidência V0.5: v05_selftest.ts deve retornar pass:true. Corpus histórico real do ChatGPT continua pendente de export oficial.
A V0.4 transforma o GUH Vault em memória consultável pelo próprio ChatGPT através do conector Val Town autenticado, sem API da OpenAI e sem scraping de chatgpt.com.
Fluxo: ChatGPT -> Val Town control plane -> vault_bridge.ts -> Turso -> FTS5/BM25 -> ChatGPT.
Ações fechadas: search, get_conversation, stats, checkpoint_upsert.
Controles: claim atômico, lease de 2 minutos, máximo 2 tentativas, recuperação de stale RUNNING, checkpoint idempotente, allowlist de ações, Turso fail-closed e resultados externos tratados como dados não confiáveis.
Evidência antes do merge: search PASS; get_conversation PASS; stats PASS; checkpoint_upsert PASS; ação proibida BLOCKED; stale recuperável PASS na segunda tentativa; stale com orçamento esgotado FAIL sem terceira execução; queue final sem PENDING/RUNNING.
Skill pessoal: skills/guh-vault/SKILL.md.
Após promover Turso a fonte principal, fallback automático para o SQLite local foi desabilitado. Motivo: após novas escritas no Turso, a cópia local pode ficar stale. Se a configuração externa desaparecer, o app deve bloquear (TURSO_REQUIRED_NOT_CONFIGURED) em vez de servir estado antigo silenciosamente.
Política pura testada:
- sem URL + sem token -> BLOCKED_EXTERNAL_REQUIRED
- somente URL -> BLOCKED_EXTERNAL_REQUIRED
- somente token -> BLOCKED_EXTERNAL_REQUIRED
- URL + token -> TURSO_ACTIVE
- localFallbackEnabled = false
O SQLite local continua preservado para recuperação/migração manual, não como fallback invisível de produção.
Checkpoint: 2026-09-06
TURSO_DATABASE_URL: configurada (valor não documentado)TURSO_AUTH_TOKEN: configurado (valor não documentado)- Turso: CONFIGURED + AUTHENTICATED + REACHABLE
- provider ativo da branch V0.3:
turso - fallback: Val Town project-scoped SQLite quando Turso não estiver configurado
- cliente:
@libsql/client/web(o cliente padrão falhou no runtime Val Town por dependência binária nativa)
Origem Val Town e destino Turso reconciliados após o checkpoint V0.3:
- conversas: 3 = 3
- mensagens: 10 = 10
- checkpoints: 3 = 3
- FTS mensagens no Turso: 10
- FTS checkpoints no Turso: 3
- SHA-256 canônico de conversas: igual
- SHA-256 canônico de mensagens: igual
- SHA-256 canônico de checkpoints: igual
Kernel timeout: PASSNR-12: PASSreconciliação: PASSexport oficial: checkpoints encontrados- termo inexistente: 0 hits
- active provider execute: PASS
- active provider batch transacional: PASS
- fixture de batch removida: PASS (
probeResidue=0) - credencial Turso propositalmente inválida: rejeitada (
LibsqlError) /api/statssem sessão: HTTP 401 / sem dados- valores de credentials não são impressos por self-tests/status
TURSO_AVAILABLE -> CONFIGURED -> AUTHENTICATED -> EXECUTED -> VERIFIED
A V0.3 ainda não deve ser chamada IPHONE_OPERATIONAL até a interface principal ser aberta no iPhone depois do merge e uma reimportação confirmar escrita/search no Turso.
Após promoção para main:
- abrir
guh-knowledge-vault.val.runno iPhone; - confirmar
V0.3 • Turso • FTS5/BM25; - confirmar 3 conversas / 10 mensagens / 10 indexadas / 3 checkpoints;
- reimportar o JSON sintético;
- confirmar que permanece 3/10/10, sem duplicação;
- pesquisar
Kernel timeout,NR-12,export oficial; - somente então promover interface V0.3 para
OPERATIONAL_SYNTHETIC_E2E_TURSO.
Cofre pessoal pesquisável para histórico exportado do ChatGPT + checkpoints do trabalho corrente, sem usar a API da OpenAI.
iPhone/browser -> OAuth Val Town -> Hono -> SQLite/FTS5 -> resultados
O código é público por restrição do workspace Free, mas as rotas de dados exigem login Val Town e aceitam apenas username === cleitoncosta.
- mensagens persistidas individualmente em
vault_messages; - índice
vault_messages_ftscom SQLite FTS5; - ranking BM25;
- tokenização Unicode com remoção de diacríticos;
- busca multi-termo com AND + prefix matching;
- fallback para a busca V0.1 quando não houver mensagens indexadas;
- checkpoints persistentes em
vault_checkpoints; - índice FTS dos checkpoints;
- busca universal capaz de retornar conversas + checkpoints;
- detalhe da conversa renderizado mensagem por mensagem quando o índice existe;
- reimportação/reindexação idempotente para uma mesma conversa;
vault_meta.schema_version = 0.2.0;- self-test stateful com limpeza de fixture.
export oficial -> conversations.json -> importador no navegador -> conversa + mensagens -> FTS5
ChatGPT/conector Val Town -> checkpoint estruturado -> vault_checkpoints -> FTS5
Isso evita depender exclusivamente de novos exports para preservar decisões e estado de projetos daqui para frente.
- 3 conversas sintéticas compatíveis com export;
- 10 mensagens de origem;
- 10 mensagens individualmente indexadas;
- 10 linhas no índice FTS das mensagens;
- 970 B de conteúdo legado de conversa;
- 1 checkpoint real sobre a prova da V0.1 no iPhone;
- 0 fixtures de self-test restantes.
- V0.1 real no iPhone: login, importação, persistência, busca e abertura de conversa;
- FTS5 disponível no SQLite do Val Town;
Kernel timeout-> conversa correta;NR-12-> conversa correta;reconciliação-> duas conversas relacionadas;- checkpoint encontrado por
export + oficial; - controle negativo inexistente -> 0 hits;
- reindex replay -> 2 mensagens continuam 2, sem duplicação;
- replay FTS -> 2 linhas continuam 2;
- self-test final ->
pass=true; - self-test remove as próprias fixtures;
index.tscompila no runtime;frontend/components/App.tsxcompila no runtime;- visitante sem sessão continua redirecionado para autenticação.
O primeiro self-test assumia incorretamente que uma busca por kernel retornaria somente a fixture. Como já havia uma conversa real de teste com esse termo, o self-test marcou FAIL apesar do sistema estar correto.
Correção: o validador passou a testar a presença da fixture dentro do escopo correto, sem assumir exclusividade global.
Lesson learned: um teste pode falhar por hipótese inválida do próprio validador; negative controls e escopo explícito são obrigatórios.
- parser contra export oficial real desta conta;
- importação real de 25/50/100 conversas;
- comportamento com um export muito grande no Safari/iPhone;
- assets, imagens, PDFs, ZIPs e outros anexos do export;
- busca semântica por embeddings/conceitos;
- camada de armazenamento maior para histórico completo;
- sincronização automática do histórico interno do ChatGPT.
A V0.2 ainda preserva conversations.content_text por compatibilidade com a V0.1 e também mantém mensagens individualizadas + índice. Isso duplica parte do conteúdo e não é a arquitetura final para milhares de conversas.
Antes da importação massiva, deve ser criada uma camada de armazenamento maior e o orçamento deve considerar tamanho físico real, não apenas content_bytes da tabela legada.
- Testar um export oficial real.
- Medir tamanho/quantidade real de chats e assets.
- Escolher storage gratuito maior para o histórico completo.
- Migrar o corpo das mensagens para arquitetura sem duplicação desnecessária.
- Adicionar projetos, entidades, relações e artefatos.
- Evoluir de full-text para busca híbrida/semântica sem depender da API da OpenAI.
- Criar interface/tool para outros agentes consultarem o Vault.
- Automatizar checkpoints quando o usuário solicitar
salve checkpoint.