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
.png)