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 analisar inicia ligado e não grava no Turso;sourceFingerprint + limite selecionado;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:
conversations*.json diretamente;file.arrayBuffer() do ZIP inteiro;vault_import_runs no Turso com estados IN_PROGRESS/PAUSED/COMPLETE/FAILED;indexed_messages;UNKNOWN_EXTERNAL_STATE e não repete cegamente;update_time; itens sem ID não são deduplicados automaticamente para evitar perda por falso positivo;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:
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_relations para relações graph-lite entre knowledge/checkpoint/conversation/entity/project/artifact/concept;knowledge_upsert, get_knowledge, related;search_hybrid: ChatGPT gera variantes conceituais; backend executa FTS5/BM25 e Reciprocal Rank Fusion, sem chamar API de IA;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:
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@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:
Kernel timeout: PASSNR-12: PASSreconciliação: PASSexport oficial: checkpoints encontradosprobeResidue=0)LibsqlError)/api/stats sem sessão: HTTP 401 / sem dadosTURSO_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:
guh-knowledge-vault.val.run no iPhone;V0.3 • Turso • FTS5/BM25;Kernel timeout, NR-12, export oficial;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.
vault_messages;vault_messages_fts com SQLite FTS5;vault_checkpoints;vault_meta.schema_version = 0.2.0;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.
Kernel timeout -> conversa correta;NR-12 -> conversa correta;reconciliação -> duas conversas relacionadas;export + oficial;pass=true;index.ts compila no runtime;frontend/components/App.tsx compila no runtime;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.
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.
salve checkpoint.