Versão
v1.2.25
O que foi entregue, em números
- 43
- PRs integrados
- 85,548
- Linhas adicionadas
- 22,326
- Linhas de código
- Código
- 22,326
- Testes
- 34,663
- Docs
- 28,559
- Soma · código + testes + docs
- 85,548
de 43 integrados
- bug 23 54%
- feature 7 16%
- polish 0 0%
- docs 9 21%
- groundwork 1 2%
- unclassified 3 7%
desde v1.2.24 · tag em
A carta
A carta do fundador, na íntegra
Oi,
Um cliente novo conseguia entrar na FlowForge, abrir o cockpit, criar um worker — e ver tudo parar numa tela de login do Claude Code cujo único jeito de resolver era digitar um comando num terminal que o aplicativo desktop não tem (#6391, #6392, #6393). Uma atualização deslogava você do seu próprio seat porque o fingerprint da máquina dependia de um hostname que o macOS reescreve (#6394). A tela de login do cockpit podia renderizar sem o campo Email e sem o campo Password (#6441). E o flowforge update retornava assim que as versões batiam, então o reparo que todo mundo busca nunca rodava (#6381, #6382, #6383, #6400).
Cada uma dessas está resolvida aqui, junto com as falhas do cockpit da semana: suas próprias teclas digitadas pintadas no cabeçalho do rail da ACE, digitação que ficava mais lenta a cada hora, um cockpit ocioso queimando CPU, e 522 processos mortos que ninguém limpava (#6378, #6379, #6387). A ACE também aprendeu a iniciar num Claude Code que não aceita --permission-mode auto, a partir de um relato de cliente (#6376), e uma crew de revisão que morre junto com a própria sessão não deixa mais um worker travado por horas (#6442).
O que precisa de um passo seu, e o que ainda não está resolvido, estão declarados claramente abaixo, cada um em sua seção.
Um abraço, Alex
Entrar sem terminal
O login do Claude Code agora é conferido antes de um worker ser construído, e a conferência tem nome. Antes, um worker recebia worktree, branch, sessão tmux e linha no Fleet, para então ficar ocioso por um prazo de 60 segundos até o painel mostrar uma tela de login do Claude Code. Agora a criação pergunta primeiro: uma máquina claramente deslogada é recusada antes de qualquer coisa ser construída, junto com o único comando que resolve isso; uma máquina cujo estado não pode ser lido segue em frente e diz isso claramente. O lançamento da ACE faz a mesma pergunta na única porta por onde todo lançamento da ACE passa (#6391). O flowforge doctor ganhou uma nova linha claude-auth que lê UNKNOWN em qualquer dúvida, em vez de chutar (#6390).
O flowforge claude login autentica o Claude Code sem precisar de terminal. Ele abre seu navegador na página de login da Anthropic, pega o código se o navegador mostrar um, e só retorna 0 quando a máquina é confirmada como logada depois disso. Se o Claude Code algum dia mudar a saída da qual ele depende, o comando volta para o caminho de terminal nomeado dentro de um tempo limitado, e nunca fica travado (#6392). O flowforge claude status [--json] relata o estado (#6393).
O gate de configuração do aplicativo desktop agora tem duas linhas, um clique cada. Antes, a sobreposição só conhecia a conta FlowForge e nada mais. Agora ela mostra as duas — FlowForge account e Claude Code — e um clique na linha do Claude Code roda o login acima, transmitindo o progresso direto na linha. Ela também pode ser alcançada a qualquer momento em ⋯ More ▸ Sign-ins… (#6393).
O desktop para de chamar toda falha de senha errada. Um servidor que não estava configurado, um arquivo de sessão que não podia ser escrito, e até um login que tinha dado certo mas não podia ser relido — todos apareciam como "That email and password didn't match." Agora, só uma incompatibilidade real de credencial mostra essa mensagem; toda outra falha é exibida com suas próprias palavras, e um login que chegou a acontecer é reconferido em vez de recusado. O aplicativo também reconfere quando a janela recupera o foco e a cada 5 segundos enquanto o gate está em tela, então um login concluído em outro lugar é percebido sem precisar reiniciar, e um cockpit que precisa de login abre o gate em vez de imprimir instruções num painel sem prompt (#6395).
Uma atualização não deixa mais você deslogado do próprio seat. O fingerprint de máquina do seat era construído em cima do hostname, que o macOS reescreve numa troca de rede, numa VPN ou num sleep/wake — então um único Mac era lido como se fossem dois, e o seat recusava a própria máquina em que estava rodando ("FlowForge is already running on /etc/machine-id no Linux). E um daemon interrompido por uma atualização agora libera o seat antes de sair, em vez de deixá-lo preso até o timeout de quatro minutos (#6394).
O formulário de login do cockpit desenha na tela. O relogin dentro do cockpit mostrava só o título e mais nada — nenhum campo Email, nenhum campo Password, nenhum erro — porque o formulário estava desenhando no arquivo de log do cockpit em vez de na tela. Agora ele desenha onde você está olhando, e um formulário que falha ao rodar diz isso claramente, em vez de parecer que você cancelou (#6441).
Renovações concorrentes de token agora são serializadas. Oito processos da FlowForge podiam, cada um, renovar a mesma sessão salva, sem nenhuma trava entre eles. Agora as renovações tomam uma trava entre processos, e toda tentativa é registrada em ~/.flowforge/auth/refresh-ledger.jsonl. Isso fecha a janela na leitura do código; ninguém reproduziu uma sessão perdida contra o servidor ao vivo (#6401).
O flowforge update conserta
O flowforge update termina a instalação mesmo quando você já está em dia. Antes, ele retornava assim que a versão batia, sem regravar os agents, hooks, commands, skills, o espelho de ~/.claude e o registro do MCP — então a única porta de reparo era o curl … install.sh | sh. Agora as etapas de instalação sempre rodam, na mesma ordem do install.sh, a partir do binário recém-instalado (#6381, #6400).
Uma atualização nunca escreve por cima de um binário ao vivo, e prova que o novo roda. Escrever novos bytes num binário macOS existente pode fazer todo lançamento seguinte ser silenciosamente morto pela checagem de assinatura de código. Agora a atualização remove o arquivo antigo antes de escrever, e falha se o binário escrito não iniciar e responder — um checksum batendo sozinho não conta mais como sucesso (#6382).
flowforge update --repair e --force. O --repair regrava os assets instalados sem precisar do servidor de release, então funciona offline ou atrás de um proxy; o --force baixa de novo e reinstala a release promovida, mesmo em paridade. O --yes, que não fazia nada, fica escondido mas ainda é aceito (#6383).
A instalação agora fala a verdade sobre sua versão. O ~/.flowforge/VERSION lia 1.0.0 em toda instalação desde a v1.0.0, e o mesmo acontecia com o marcador FLOWFORGE BEGIN v… em todo CLAUDE.md espelhado. Agora os dois carregam a versão real. Cada instalação grava um carimbo em ~/.flowforge/state/install.json, e uma nova linha do flowforge doctor, install-freshness, fica vermelha quando os assets instalados e o binário rodando discordam, apontando para o flowforge update --repair (#6383).
O cockpit fica sólido
A FlowForge limpa a própria sujeira. No meu próprio Mac, com zero workers rodando: 522 processos filhos mortos sob um único cockpit, 84 sockets tmux mortos, e seis servidores tmux abandonados com até nove dias de idade — e o instalador só imprimia "report only, never killed." Agora todo início de cockpit e toda instalação ou atualização remove esses restos e imprime o que removeu e quais workers vivos preservou, nomeando cada um. Um cockpit ou servidor de worker ao vivo nunca é tocado, nem nada que a FlowForge não tenha criado ou não conseguisse checar. O flowforge hygiene (apelido sweep) é a porta manual, somente-relatório por padrão. Todo processo filho que a FlowForge inicia agora é esperado até terminar (#6378).
Suas teclas digitadas não aparecem mais no cabeçalho do rail da ACE. A linha de atividade do rail subia pelo painel atrás de "a última ação" e acabava tomando sua própria mensagem quebrada em várias linhas como se fosse uma, pintando-a na linha de status. Agora a atividade só é lida a partir do que aconteceu depois da sua última mensagem (#6379).
A digitação não fica mais lenta quanto mais tempo o cockpit fica aberto. Cada novo turno reenviava a transcrição inteira; agora só uma janela final é reenviada, então o custo permanece estável não importa por quanto tempo a sessão rode (#6379).
Um cockpit ocioso para de queimar CPU à toa. Um gerenciador de voz ocioso mantinha um relógio de 10 quadros por segundo reconstruindo o rail para sempre; agora ele para quando em repouso. A varredura de processos de worker agora transmite a tabela de processos em vez de copiá-la, e roda no máximo a cada 5 segundos em vez de todo segundo, e um cockpit sem workers não roda nenhuma (#6379, #6387).
O F5 repinta tudo. Um cockpit cuja tela parece errada agora sempre tem uma saída: o F5 descarta todo cache de renderização e redesenha o quadro inteiro, em qualquer estado (#6379).
Uma colagem durante uma composição de método de entrada não trava mais o terminal do desktop. Uma colagem que chegava enquanto uma composição de IME ou ditado estava aberta travava o terminal, e toda tecla digitada depois dela era engolida. Agora a composição é confirmada primeiro, em ordem, e nada se perde (#6374).
A ACE inicia num Claude Code sem --permission-mode auto (relatado por cliente). A FlowForge presumia que todo Claude Code aceitava auto; um que não aceitava saía na hora, e o rail continuava dizendo ● alive enquanto o que você digitava rodava como comandos de shell. Agora a FlowForge pergunta ao Claude Code instalado quais modos ele aceita, o rail mostra um lançador que morreu por causa dos próprios argumentos como uma falha, com o erro e o remédio, e o flowforge doctor ganhou uma linha claude-permission-mode (#6376).
Um worker aposentado aparece como retired, não vanished. Antes, um worker encerrado de propósito depois que o PR dele foi mesclado aparecia igual a um crash. O reaper também nomeia qualquer branch não enviada (unpushed) que um worktree ainda guarde antes de removê-lo, junto com o comando para recuperá-la, e um auto-merge agora diz qual PR, qual head e qual gate ele passou (#6399).
Lendo o cockpit num relance
Dois relógios com nome no cabeçalho. O TIME vira FLOWFORGE SESSION, que sobrevive a um restart da ACE, e CONTEXT, que zera num /clear e num reset — para que você veja de verdade quão velho é o contexto no qual está prestes a confiar (#6424).
O medidor ctx para de pular para trás. Uma sessão perto de 95% cheia chegava a ler ctx 45%, 9% e 39% dentro de um único minuto, porque o medidor pegava a linha mais nova de um feed que estava reproduzindo o passado da sessão. Agora ele pega o maior valor que a sessão já alcançou (#6423).
O rail da ACE narra um turno longo. Em vez de um único "running a command…" até o turno terminar, o rail mostra o passo atual, um registro do que já foi concluído (tickets abertos, workers criados, PRs mesclados), e um relógio por passo. Um passo que não pode ser lido diz isso claramente, em vez de ganhar um rótulo qualquer (#6427, #6437).
Planos e o Gantt
Uma sprint agora pode depender de outra sprint. O flowforge sprint-dep registra uma aresta finish-to-start entre duas sprints, em dry-run por padrão, nomeando a consequência na data sem mover data nenhuma; o flowforge sprint-dep-audit bloqueia numa aresta quebrada ou numa que as datas neguem, e avisa sobre uma dependência escrita só em prosa. O Gantt desenha as sprints de uma iniciativa inteira num único gráfico, com essas arestas e o caminho crítico entre sprints (#6419).
O Gantt para de dar boa notícia ao lado de um trabalho atrasado. As leituras de ritmo e estimativa costumavam dizer on track ou 100% on-time em verde ao lado de tickets abertos além do fim planejado. Agora elas retêm o veredito e mostram a contagem de atraso no lugar (#5597).
SV(t) e SPI(t) estão de volta na faixa do Gantt. A leitura de earned schedule só mostra uma direção onde o esforço real de um ticket aberto não consegue mais reverter o quadro (#6143).
Fica provado que o caminho lógico não se move com a sprint. A diferença entre o caminho lógico e o caminho alcançável agora é testada como o custo da fronteira, em toda largura (#5596).
Revisões que não deixam mais um worker travado
Uma crew de revisão que morre junto com a própria sessão não deixa mais o worker esperando por horas. Quando a sessão que tinha disparado uma revisão terminava, a crew era morta sem escrever nada, e o round dela dizia "still running" por até 3 horas e 10 minutos — um beco sem saída que só uma pessoa conseguia destravar. Agora o round confere se a crew está viva, registra uma crew morta como encerrada sem veredito, e o heal já existente redispara a revisão no próximo batimento (#6442).
O override de push pós-GOLDEN agora exige uma classe, não uma frase qualquer. O FF_GOLDEN_PUSH_OVERRIDE aceitava qualquer prosa, então um worker podia dar override no próprio guard que acabara de recusá-lo. Agora ele só aceita base-sync: <why>, provado na fonte, ou founder: <why>, registrado e contado separadamente (#6412).
Um GOLDEN anulado agora leva a data do push que o quebrou, não a da revisão que o concedeu, então uma anulação recente não cai mais fora da janela do relatório (#6420).
Colado
Colado é um termo do jiu-jitsu — uma posição está colada quando está justa, perfeitamente ajustada, sem folga, pressão máxima. É o nome para a família de gates da FlowForge que não deixam espaço nenhum entre a regra e o trabalho. Esta versão fecha estas lacunas:
- Um worker não pode mais ser construído numa máquina claramente deslogada do Claude Code — a criação pergunta primeiro (#6391).
- Um update não pode mais contar como instalado um binário que não inicia — o binário escrito precisa rodar (#6382).
- Um worker não pode mais se conceder o override que o guard acabou de recusar — o override precisa nomear uma classe, e
base-syncé provado (#6412). - Um processo filho que a FlowForge inicia não pode mais ficar sem ser coletado — todo início agora é esperado até terminar, e um teste recusa a forma que vazava (#6378).
- Uma crew de revisão morta não pode mais manter um round aberto — o round lê se a crew está viva (#6442).
Coisas singelas que mudam tudo
Nem toda mudança merece um grande destaque. Cada uma cabe numa linha, e você a sente todo dia.
- O seletor do ForgePlay agora tem scroll, e a seleção nunca fica parada sobre uma play que você não consegue ver (#6433).
- O F5 repinta o cockpit inteiro, seja qual for o estado em que ele esteja (#6379).
- Um worker aposentado aparece como
retired, então um trabalho concluído não parece mais um trabalho perdido (#6399). - Um auto-merge nomeia seu PR, sua head e seu gate no rail (#6399).
Estudos e planos
Nada abaixo está construído ou entregue — cada item é um estudo ou um plano, e está declarado aqui só como o que é.
- ADR-0139 — o cockpit é rocha sólida e a FlowForge deixa o acampamento mais limpo do que encontrou (#6388).
- A crew que constrói software, e a crew que a lança — dois estudos sobre o elenco de agents, aguardando ratificação (#6425, #6426).
- Ondas concorrentes (Concurrent waves) — um estudo sobre rodar várias waves ao mesmo tempo num único host, aguardando ratificação (#6434).
- O DAG de entrega do FLEET READ — dividido em dois planos e gerado a partir da própria tabela (#6141, #6413).
Menores, e nos bastidores
- Dois testes que fariam o corte ficar vermelho estão corrigidos. Um scanner de código lia
claude authcomo se fosse uma suposição sobre o GitHub CLI (#6447), e o teste de reuso de inode para a correção do update não conseguia provar sua alegação no Linux (#6448). Nenhum comportamento entregue mudou. - Um teste que alegava percorrer os processos filhos do update só filtrava dois caminhos; agora ele percorre o que cada filho de fato alcança (#6400).
Um passo de configuração
- Autentique o Claude Code uma vez, se o cockpit pedir. Numa máquina deslogada, criações de worker e a ACE agora são recusadas com a correção na mão, em vez de travarem: rode
flowforge claude login(ouclaude auth login), ou clique em Sign in na linha do Claude Code no desktop, depois aperterno cockpit para reconferir (#6391, #6392, #6393). - Espere uma última espera de quatro minutos pelo seu seat nesta atualização. O daemon do qual você está atualizando é anterior à correção de liberação de seat, então o seat que ele segura só libera no próprio timeout, dessa vez. A partir da próxima atualização, o seat é liberado na saída (#6394).
- Se você definiu
FF_GOLDEN_PUSH_OVERRIDE, dê a ele uma classe. Uma frase qualquer agora é recusada; usebase-sync: <why>oufounder: <why>(#6412). - Encerre e reabra todo cockpit aberto depois de atualizar, para que a nova checagem de login, a faxina de higiene e as correções do rail estejam rodando.
Ainda não
- A meta de CPU ociosa ainda não está provada num cockpit rodando de verdade. As correções acima removem o relógio ocioso e reduzem a taxa da varredura de processos, e o custo por quadro está garantido por um teste, mas um número de "depois" a partir de um cockpit ao vivo nesta versão ainda não foi medido, e o cache de renderização da War Room que o trabalho também planejava foi revertido (#6379, #6387).
- Um worker sem worktree e sem linha no Fleet não é varrido. Remover um significaria matar uma sessão num cockpit ao vivo com base num sinal conhecido por não ser confiável, então isso fica para depois (#6378).
- O
flowforge claude logindepende da saída atual de login do Claude Code. Ele foi remedido na versão 2.1.274 do Claude Code e volta para o caminho de terminal se essa saída mudar (#6392). - No Linux, o fingerprint do seat identifica a instalação, não o hardware — um disco de VM clonado ou uma imagem de container carrega o mesmo id (#6394).
Agentes
Nenhuma mudança de elenco nesta versão: a FlowForge instala os mesmos 44 especialistas que a v1.2.24 entregou (git diff --name-status -M v1.2.24 origin/release/1.2.25 -- v3/packages/core/agents está vazio).
Atualizar
flowforge updatenuma instalação já existente, oucurl -fsSL https://get.flowforgesoft.com/install.sh | shpara uma nova. Os dois caminhos gravam o mesmo binário de release em/usr/local/bine~/.flowforge/binjuntos. Oflowforge update --repairregrava os assets instalados sem precisar de rede. Depois, encerre e reabra todo cockpit aberto.
Os números desta página são uma leitura pontual de v3/site/src/data/release-stats.json, chave "v1.2.25" (computed_at: 2026-09-21T16:01:47Z), intervalo v1.2.24 (b10ad4f11, com tag em 2026-09-17T08:33:54-04:00) → lane head 79042f1b8 — a v1.2.25 ainda não tem tag, e estas cifras serão re-derivadas na tag antes do corte.