Mesma função, dois donos
Dois agentes editam a mesma função. O git só avisa na hora de juntar, e aí um deles refaz.
A Torre é um servidor git feito para agentes de IA que trabalham juntos. Enquanto cada agente trabalha, ela mostra o que os outros estão mudando e só deixa o código chegar ao tronco depois de testar. O agente usa só git commit e git push.
Você está aqui porque foi convidado. É um beta: leia os limites antes de enviar qualquer código.
O problema
Com dois ou três agentes de IA no mesmo repositório, cada um parte de uma cópia e não sabe o que os outros estão mudando. Todos passam nos seus próprios testes. O problema só aparece no merge, quando o trabalho já foi feito.
Dois agentes editam a mesma função. O git só avisa na hora de juntar, e aí um deles refaz.
Um muda round(x) para round(x, mode); outro, ao mesmo tempo, cria um arquivo que chama round(x). Juntos, o tronco quebra.
Rebasear, corrigir, rodar tudo de novo. O custo é o tempo e os tokens dos agentes, e às vezes um tronco vermelho.
O exemplo do meio é o cenário que medimos (veja Resultados).
O que é a Torre
O agente continua usando só git. As linhas abaixo são trechos reais do que a Torre responde, tirados dos resultados das etapas 3 a 7 do projeto. Quando vêm num git push, o git põe remote: na frente.
Um git push comum, em qualquer ramo, grava um rascunho da tarefa (a Mudança, C-n) sem tocar no tronco. Os outros agentes passam a ver o que você está mexendo.
$ git push origin HEAD
remote: torre ▸ C-5 v1 gravada · você mexe em: relatorio_<run>.ts#total (nova)
relatorio_<run>.ts é o arquivo que o teste gera a cada rodada.No push, e no meio da tarefa (por um hook do Claude Code), a Torre avisa quando alguém mexe no mesmo lugar. São fatos sobre os outros agentes; quem decide é o seu agente.
Colisão mesma função. Duplicata o mesmo código em dois lugares. Contrato uma assinatura que você lê ou muda está mudando.
torre ▸ CONTRATO lib/calc.ts#soma: soma(a, b) → soma(a, b, c) por C-7 (outro, mexendo agora, visto há 12 s); você lê soma
remote:. O agente que lê soma sabe, antes de pousar, que outro está mudando a assinatura.git push origin HEAD:pousar junta o seu trabalho com o tronco, testa as pastas afetadas e responde na hora: entrou (POUSOU), ficou esperando uma pessoa, ou foi recusado com um próximo: dizendo o que fazer.
O que precisa de um humano (uma migração, o torre.toml, uma dependência nova) espera a sua decisão no painel. O push não repete: o resultado chega no próximo.
$ git push origin HEAD:pousar
remote: torre ▸ POUSOU no tronco @35f10d6 · autoridade …
claude -p (autoridade abreviada com …).$ git push origin HEAD:pousar
remote: torre ▸ FILA AGUARDANDO HUMANO Q-1: migrations/001.sql pede aprovação humana ([humano] do torre.toml)
# você aprova no painel (ou: torre responder Q-1 sim). O push seguinte recebe POUSOU.
Q-1, migrations/001.sql). Depois da aprovação, o push seguinte pousou.Resultados
O teste principal (a “prova 2”): três agentes Claude Sonnet, três tarefas que se cruzam no round (uma muda a assinatura, outra cria um chamador, outra mexe na mesma linha), 5 rodadas por braço, comparando a Torre com git puro sem CI de bloqueio.
Rodadas com o tronco vermelho, Torre contra git puro.
Tarefas entregues, Torre contra git puro.
Até a última entrega: a Torre foi mais lenta.
| Métrica | Torre | Git puro |
|---|---|---|
| Rodadas com tronco vermelho | 0 de 5 | 4 de 5 |
| Tronco final verde | 5 de 5 | 2 de 5 |
| Custo por rodada (média) | US$ 0,91 | US$ 0,79 |
| Turnos por rodada (média) | 52,0 | 42,4 |
| Aviso CONTRATO chegou a quem muda a assinatura | 5 de 5, antes do 1º commit | não existe |
Na Cloudflare (a produção deste beta): smoke de ponta a ponta 14/14 duas vezes e 10 de 10 pousos medidos, a partir de São Paulo, em repo pequeno e sem concorrência. Fonte de todos os números: docs/relatorio-final.md do projeto.
Como experimentar
Você precisa de Node 22 ou mais novo, git, a sua chave de convite (ela vem de quem convidou você, por fora desta página) e um repositório pequeno, sem segredos, para testar.
Cole a chave quando o terminal esperar (nada aparece na tela). Ela fica só nessa janela: não vai para o histórico nem para a linha de comando. O nome da variável é TORRE_LANCADOR; o valor é a sua chave.
read -rs TORRE_LANCADOR && export TORRE_LANCADOR
A CLI sai daqui mesmo (cerca de 10 KB), sem passar pelo registro do npm e sem instalar nada. Ela já aponta para https://gitflare.com.br.
alias torre='npx --yes https://gitflare.com.br/cli.tgz'
torre --help
O torre.toml diz que testes rodam em cada pasta antes de pousar. O comando só imprime a sugestão: revise, salve como torre.toml na raiz do ramo e faça o commit.
torre sugerir-toml ~/codigo/meu-repo
<org>/<repo> é o nome na Torre (minúsculas, dígitos e hífen); use o <org> que veio no seu convite. Importar de novo o mesmo ramo não faz mal.
torre importar ~/codigo/meu-repo <org>/<repo>
O comando cria a tarefa, monta uma pasta de trabalho e roda o seu agente nela; o agente só faz git commit e git push. Para ver os avisos de verdade, abra um segundo terminal e peça uma tarefa que mexa na mesma função.
torre nova <org>/<repo> "o que o agente deve fazer" --harness claude-code -- claude
Abra o painel e entre com a mesma chave. Ele lista os seus repositórios; escolha um. Radar mostra quem mexe em quê, Perguntas o que espera a sua decisão (aprovar ou negar), Mudanças o histórico, com Desfazer para reverter um pouso.
Limites do beta
Só entra quem foi convidado. Cada pessoa tem a própria chave, que só enxerga os próprios repositórios. Pode cair, mudar ou ser reiniciado sem aviso.
Não importe chaves, senhas, dados de clientes nem código que não possa ir para a nuvem. A Torre recusa e congela pushes com segredos óbvios, mas isso não é garantia.
O repositório importado e os rascunhos ficam na conta Cloudflare da Torre, e os testes do torre.toml rodam num container nosso, com rede aberta. O seu repositório no GitHub não é alterado.
Peça a quem convidou e o seu repositório sai da Torre. Os testadores usam o mesmo ambiente: não existe cópia à parte.
Push de até 8 MB, uma referência por push, sem --force, sem apagar ramo e sem clone raso. O aviso por função vale para TypeScript, Python e Go; nas outras linguagens a comparação é por trechos de arquivo.
Um pouso por vez no executor, sem teste de carga e sem alertas montados. Se algo travar, conte a quem convidou; é exatamente o que o beta quer descobrir.
Quem fala com quem
Use o mesmo canal em que o convite chegou. Essa pessoa fala com a Torre por você, resolve ou repassa. Conte o que rodou, o que esperava e o que viu, de preferência com as linhas torre ▸ do terminal.
Nunca cole a sua chave em mensagens, issues, prints ou no terminal de outra pessoa. Se ela vazar, avise quem convidou e ela é trocada.