Carregando publicação…
Carregando publicação…
O Git enxerga commits prontos, mas é cego para o que acontece entre eles. Entenda a engenharia por trás do DeltaDB: grafos causais inspirados no algoritmo Eg-walker, árvores B+ copy-on-write em SQLite e sincronização por thread via Cloudflare Durable Objects.
Durante quase duas décadas, a unidade atômica de memória da engenharia de software foi o commit do Git. O modelo desenhado por Linus Torvalds em 2005 parte de uma premissa clara: humanos editam arquivos localmente em silêncio, testam hipóteses, descartam tentativas frustradas e, quando chegam a um estado coerente, empacotam um snapshot imutável acompanhado de uma mensagem de texto explicando a intenção da mudança.
Na era da programação assistida por agentes autônomos, essa premissa ruiu. O volume de código produzido por minuto cresceu em ordens de grandeza, e o processo de clarificação arquitetural — as restrições discutidas, os trade-offs rejeitados e as instruções que deram origem a cada função — deixou de acontecer apenas na cabeça do desenvolvedor ou em revisões de Pull Request. Hoje, o raciocínio por trás do código nasce dentro de threads de conversação com agentes.
Quando essa sessão vira um commit tradicional, o contexto se perde: na melhor das hipóteses, fica preso no histórico proprietário do harness usado naquele dia; na pior, evapora em uma mensagem de commit genérica gerada pelo próprio modelo que ninguém leu.
Para atacar essa lacuna estrutural sem exigir que as equipes abandonem o Git, a Zed Industries — criadora do editor Zed e do ambiente agêntico Delta — revelou a arquitetura interna do DeltaDB, detalhada em um artigo técnico assinado por Antonio Scandurra (@as__cii), cofundador da empresa. Escrito em Rust, armazenado localmente em SQLite e sincronizado na borda via Cloudflare Durable Objects, o DeltaDB funciona como um sistema de controle de versão de granularidade fina que unifica edições de código, mensagens de conversa, comentários e árvores de arquivos em um único grafo causal contínuo.
O Git continua insubstituível para publicar histórico consolidado, gerenciar branches oficiais e acionar pipelines de CI/CD. Mas usar commits e git worktree como mecanismo de coordenação em tempo real entre humanos, subagentes locais e cloud runners esbarra em três gargalos severos:
git worktree: O Git nativo impede que duas worktrees façam checkout da mesma branch simultaneamente e exige cópias físicas completas do repositório no disco para cada agente paralelo, multiplicando o tempo de setup e limpeza.WIP) e empurrar branches temporárias para o repositório remoto.A abordagem do DeltaDB separa claramente as responsabilidades: o Git guarda os commits; o DeltaDB guarda tudo o que acontece entre eles. Quando você aponta para uma linha de código, consegue rastrear qual delta específico gerou cada caractere e saltar diretamente para o trecho exato da conversa — humana ou de um agente — que motivou aquela alteração.
Por baixo do capô, o DeltaDB modela todo o estado de uma agent thread — transcrição da conversa, arquivos da worktree, metadados e comentários — como uma coleção de CRDTs (Conflict-free Replicated Data Types) encadeados em um Grafo Acíclico Dirigido (DAG) monotônico.
Cada nó desse grafo é chamado de delta, a menor unidade indivisível de mudança no sistema. Ao adotar CRDTs, qualquer cliente (o app nativo, a CLI, um subagente ou um navegador web) pode aplicar mutações localmente com latência zero, operar offline durante falhas de rede e convergir de maneira determinística assim que a conexão for restabelecida, independentemente da ordem em que os pacotes cheguem.
Version Vectors)Uma decisão arquitetural decisiva revelada por Scandurra foi rejeitar vetores de versão tradicionais (version vectors e dotted version vectors) em favor da navegação direta de ancestralidade no DAG, seguindo de perto o modelo introduzido por Joseph Gentle e Martin Kleppmann no artigo científico Eg-walker (Event Graph Walker).
Em sistemas colaborativos clássicos, um vetor de versão mantém um contador numérico para cada ator (actor_id -> seq), permitindo verificar em $O(1)$ se uma versão já incorpora outra. Contudo, esse modelo pressupõe que os atores são poucos e longevos. Em um fluxo de engenharia com IA, humanos abrem e fecham sessões e subagentes efêmeros nascem e morrem a cada minuto. Uma vez que um subagente emite um único delta, seu contador jamais pode ser removido do vetor de versão sem risco de ambiguidade — fazendo o metadado crescer indefinidamente.
No DAG do DeltaDB, o estado completo do sistema em qualquer instante é representado apenas pelos deltas nas pontas abertas do grafo (a frontier). O tamanho dessa fronteira cresce proporcionalmente ao número de ramificações concorrentes abertas naquele exato momento, e não ao total histórico de agentes que já escreveram na thread. Para tornar as consultas de ancestralidade rápidas sem vetores de versão, o DeltaDB armazena a topologia dos pais de cada delta separadamente do seu payload, em ordem estritamente causal, aproveitando ao máximo a localidade de cache no SQLite.
Como cada delta aponta explicitamente para a versão-pai sobre a qual foi construído, sua representação na rede pode ser extremamente enxuta. Uma edição de texto, por exemplo, resume-se a três campos em Rust:
struct EditTextDelta {
parent: Version,
offset: usize,
text: String,
}
Na imensa maioria das vezes, o buffer local já está na versão parent, e a inserção no offset ocorre diretamente. Se uma edição concorrente tiver avançado o buffer nesse meio-tempo, o cliente reifica (reconstrói) a versão exata de parent, traduz o offset numérico para o identificador interno de fragmento (fragment ID, similar ao motor de texto do Zed) e localiza onde esse fragmento se encontra na versão atual. Isso reduz drasticamente o tráfego de rede e permite paginar fragmentos inativos para fora da memória.
SumTree do ZedComo a aplicação de edições concorrentes, o scrubbing instantâneo pela linha do tempo da conversa e a montagem de worktrees antigas no disco dependem da capacidade de reconstruir qualquer versão do DAG em milissegundos, o armazenamento local em SQLite precisou de uma engenharia própria.
O DeltaDB mantém snapshots em cache para os nós recentemente acessados no DAG (além de versões-chave fixadas). Quando precisa materializar uma versão arbitrária, ele caminha para trás no grafo até o ancestral mais próximo com snapshot em cache e aplica apenas os deltas intermediários.
Para que guardar dezenas de snapshots no SQLite não exploda o consumo de disco, todo o estado versionado é estruturado como árvores B+ Copy-on-Write (CoW). Assim, um novo snapshot compartilha estruturalmente quase todos os nós da árvore anterior, alocando novas linhas apenas para o caminho modificado pelos deltas recentes.
Curiosamente, a equipe não reutilizou a famosa SumTree do editor Zed sem modificações. No Zed, a SumTree é uma árvore B+ estritamente append-only: para editar um item no meio da árvore, é preciso fatiar o prefixo até o ponto de inserção, empurrar os novos elementos e concatenar o sufixo, reconstruindo todos os nós ao longo do corte.
No DeltaDB, em que cada nó da árvore corresponde a uma linha na tabela genérica nodes do SQLite, reconstruir prefixos e sufixos geraria um volume excessivo de escritas em disco. A solução foi projetar uma árvore B+ com cursor mutável (in-place mutation), rastreando com precisão cirúrgica o ciclo de vida de cada nó durante uma transação:
INSERT na tabela nodes;UPDATE);Para coordenar agentes trabalhando em paralelo sem tocar no Git, o DeltaDB introduz o conceito de Timelines. Sempre que um agente principal dispara um subagente para investigar ou refatorar um subsistema, o cliente cria uma nova timeline estacionada na fronteira (frontier) atual da thread-mãe. O subagente faz suas alterações de forma isolada dentro do mesmo DAG e, ao terminar, sua timeline é mesclada de volta sem necessidade de commits intermediários ou branches órfãs no Git.
Quando uma thread é compartilhada entre desenvolvedores ou cloud runners, a sincronização ocorre via WebSockets:
No lado do servidor, a Zed adotou um isolamento radical: cada thread do DeltaDB é sincronizada com a sua própria instância de Cloudflare Durable Object.
#[derive(Replicate)] e o orçamento de 8 ms na interface nativaPara que os próprios engenheiros do Delta não precisem manipular nós de DAG ou cursores SQLite manualmente ao construir funcionalidades do produto, todo o motor foi encapsulado em quatro primitivas reativas de alto nível expostas pelo deltadb::Client:
Register<T>: contêiner escalar com resolução last-writer-wins;Map<K, V>: dicionário distribuído com semântica add-wins;Buffer: texto colaborativo apoiado em rope e índice de fragmentos por caractere;Worktree: árvore de arquivos sobreposta ao Git que começa em um commit base e mantém cada arquivo fixado no blob original ou acrescido dos deltas escritos desde então.Com a macro procedural #[derive(Replicate)], estruturas complexas do domínio da aplicação são declaradas como código Rust idiomático:
#[derive(Clone, Replicate)]
struct Thread {
#[field(0)] transcript: Buffer,
#[field(1)] name: Register<String>,
#[field(2)] worktree: Worktree,
#[field(3)] comments: Map<u64, Comment>,
}
Por trás dessa ergonomia, cada Register, Map, Buffer ou Worktree é apenas um ponteiro leve (RegisterId, BufferId) para dentro de um único CRDT plano chamado Snapshot, composto por quatro árvores B+ Copy-on-Write (CowBTree).
Enquanto na CLI do Delta o processo pode consultar o SQLite diretamente, na interface gráfica nativa do Delta (construída sobre a fundação acelerada por GPU do Zed) qualquer operação de I/O bloqueante na main thread estouraria imediatamente o orçamento estrito de 8 milissegundos por quadro (120 fps).
A solução engenhada pela equipe trata a própria main thread da UI e as threads de persistência em segundo plano como dois clientes concorrentes operando sobre o mesmo CRDT:
Arc<Snapshot> na memória RAM;Arc<Snapshot> (graças ao Copy-on-Write) para um pool em segundo plano (1 writer thread dedicada ao SQLite e 2 a 4 reader threads para rede);Arc<Snapshot> atualizado para a main thread, reaplicando por cima eventuais deltas que o usuário tenha produzido naqueles poucos milissegundos.Um dos aspectos mais pragmáticos do anúncio é que o DeltaDB não exige trocar de ferramenta da noite para o dia. Além do aplicativo desktop nativo Delta e da visualização em tempo real pelo navegador web, a Zed disponibilizou a Delta CLI e plugins oficiais para harnesses de terceiros — começando pelo Claude Code.
Dentro de qualquer sessão do Claude Code, basta adicionar o marketplace da Zed e instalar a extensão:
claude plugin marketplace add zed-industries/delta-claude
claude plugin install delta@zed-industries
A partir desse momento, executar /delta share dentro do Claude Code transforma a sessão local e sua worktree em uma thread sincronizada pelo DeltaDB: colegas de equipe podem entrar na mesma conversa pelo terminal ou pelo navegador, inspecionar os arquivos modificados enquanto o agente ainda está trabalhando, deixar comentários em linhas específicas e voltar no tempo para qualquer mensagem da conversa restaurando instantaneamente o estado exato dos arquivos no disco — sem precisar de um único git commit até que o trabalho esteja pronto para virar Pull Request.