dispatch

Ferramenta de desenvolvimento

Uma CLI em Go que roteia uma tarefa para o agente instalado com folga de quota, por tier de dificuldade em vez de nome de modelo.

Várias CLIs, várias quotas

Eu uso várias CLIs de agentes de código, cada uma com seu plano e seu limite semanal. Toda vez que delegava uma tarefa eu precisava lembrar qual ainda tinha folga e qual nome de modelo estava valendo, e esses nomes mudam o tempo todo.

Eu queria dizer o quão difícil é a tarefa e deixar outra coisa escolher onde ela roda.

Tiers em vez de nomes de modelo

O dispatch recebe easy, normal ou hard e resolve isso por uma tabela editável de pares agente e modelo. Não construí mais um agente de código: ele envolve os CLIs que já estão instalados e devolve um resultado compacto, para o chamador gastar poucos tokens lendo.

Os candidatos são ordenados pelo pace de quota, a mesma ideia linear de esperado contra real que o CodexBar usa, com uma estimativa histórica semanal quando há snapshots suficientes. Se um agente falha ou bate rate limit, o run cai para o próximo, e o agente limitado fica uma hora em cooldown. Runs de escrita ganham um git worktree e uma branch próprios, então delegações em paralelo não colidem, e as sessões podem ser retomadas entre elas.

Escolhi CLI em vez de MCP de propósito. Um servidor MCP soma custo fixo de contexto e runs longos brigam com os timeouts, enquanto todo cliente já tem shell. Os agentes aprendem a ferramenta por uma skill que o dispatch skill install grava na pasta de skills de cada um.

Vendo ele trabalhar

O dispatch sem argumentos abre uma interface de terminal que acompanha os runs do repositório ao vivo: um cartão por delegação, uma tela cheia com a saída do agente conforme ela é escrita, uma tela de estatísticas e uma de learning. As estatísticas contam só o que o próprio dispatch rodou, não a minha conta inteira, porque uso esses CLIs para outras coisas também. A tela de learning mostra o que um classificador pequeno por tier aprendeu sobre quais runs falham na verificação, e diz isso com clareza enquanto há poucas amostras. Uma tela de settings edita a config, a tabela de tiers e os perfis de subagent no lugar, validando cada valor antes de salvar, com o arquivo inteiro a uma tecla de distância no $EDITOR para o que for maior. A aba Agents detecta as CLIs da máquina e deixa cadastrar o caminho de um binário, para que uma CLI fora do PATH ainda seja encontrada.

Todo run é verificado contra a base antes de poder entrar. O dispatch merge recusa uma verificação que falhou, checa conflitos antes, verifica de novo depois do merge e grava o resultado no run.

Ele aprende com o uso

O roteamento não é uma tabela fixa. Cada run é registrado com o que aconteceu e se passou na verificação, e o dispatch aprende com esse histórico. Um classificador pequeno por tier, treinado só nesta máquina, sem LLM e sem rede, aprende que tipos de tarefa falham na verificação e pode sugerir um tier mais alto. Ele parte de regras simples, como subir um tier para código sensível, e a tela de learning mostra até onde vai a evidência dele, dizendo isso com clareza enquanto há poucas amostras. Os snapshots de quota alimentam uma estimativa de ritmo, e um rate limit coloca aquele agente em cooldown de uma hora e o desce no ranking. As sugestões nunca mudam um run sozinhas: aparecem como uma nota.

Onde está agora

É um v0.4.0 funcionando: os adapters rodam, retomam e fazem fallback, e verifiquei runs em background, worktrees e merges num repositório real. O roteamento pode ser guiado por filtros de provider, modelo, esforço e prioridade e por uma política persistente de allow e deny, e o dispatch route mostra o plano que um run executaria. O dispatch update atualiza o binário no lugar (com SHA-256 conferido), e perfis de subagent nomeados (dispatch run --as reviewer) fixam papel, tier e preferências suaves de agente. Os binários prontos são publicados para macOS e Linux, mas só exercitei o de macOS arm64.

A quota é real só para as CLIs que a expõem. As outras não têm fonte oficial, então para elas o roteador aprende com erros de rate limit em vez de prever. Também ainda não vi o Claude Code operá-lo de ponta a ponta, então a skill foi escrita para esse caso, mas não está provada nele.

Feito com

Go

Código