/dash abre no navegador um grafo ao vivo do runtime. Cada agent, cada requisição de LLM, cada chamada de tool, cada skill que ativa, cada servidor MCP, cada padrão do harness que dispara, cada job em background e cada conexão de saída é um nó; uma aresta pulsa toda vez que algo acontece nela.
É telemetria de ponta a ponta sem configuração: sem collector, sem agente, sem conta. Vem desligada por padrão e não custa nada enquanto está desligada.

Uma faixa por processo. Os agents formam uma árvore pelo pai real; tudo o que eles usam é um hub com contadores, latência e estado. (Dados sintéticos.)
Como abrir
/dash funciona com um turno rodando (digite no meio da execução) e via ACP, onde o endereço volta para o chat da IDE.
O navegador só abre a partir de um terminal interativo. De um daemon, de um pipe ou de uma IDE, o endereço é impresso.
Ela enxerga todos os processos, não só este
Abrir a dash faz todo processo chatcli da máquina começar a reportar: o REPL onde você digitou/dash, um segundo terminal, o daemon do gateway, o agent ACP dentro da sua IDE, o servidor MCP que outro cliente está dirigindo, o daemon do scheduler. Cada um é uma faixa na página.
É para isso que existe o chatcli dash: o agent ACP, o servidor MCP e os daemons não têm prompt onde digitar /dash, e o stdout deles é um stream de protocolo. Uma dash em outro terminal é a única janela para dentro deles.
Como a gravação liga e desliga
- Quem serve uma dash mantém renovado um pequeno arquivo de lease em
~/.chatcli/pulse/. - Todo processo chatcli confere esse lease a cada dois segundos. Enquanto ele não expira, o processo grava no próprio spool.
- O lease só é renovado enquanto um navegador está de fato consultando. Feche a aba e, cerca de 30 segundos depois, todos os processos voltam ao silêncio sozinhos. Nada fica ligado por acidente.
.env passa a valer no /reload.
O que você vê
Sessões e agents são um nó cada, ligados pelo pai real, então um dispatch multi-agent aparece como árvore. Todo o resto é um hub agregado por nome (a tool@coder, o servidor MCP github, o padrão self-refine) mostrando chamadas, quantas estão ativas agora, erros e latência média. O grafo fica estável e dispara, em vez de explodir em um nó por chamada.
Os sete padrões, com desfecho
Self-Refine, CoVe e Reflexion rodam em silêncio: reescrevem a saída de um worker, marcam uma discrepância ou enfileiram uma lição sem imprimir uma linha. A dash mostra não só que o padrão disparou, mas o que ele concluiu.
Um padrão desligado, ou cujos guards rejeitam o resultado, não fez nada e fica apagado.
Os rótulos de desfecho são fixos e em inglês: são escolhidos pelo código, nunca são saída do modelo.
Coisas fáceis de não perceber sem ela
- Uma compaction parece um travamento. A compaction do histórico resume a conversa com uma chamada de LLM própria e segura o turno pelo tempo que isso levar. Na dash ela é um span
compactionque termina comappliedouskipped. - Um diálogo de permissão que ninguém respondeu. Via ACP/MCP ele aparece como uma chamada
client:session/request_permissionque não termina. - O dev server que você subiu há uma hora. Os processos do
@procsão reapresentados quando a dash abre, então aparecem mesmo tendo começado muito antes. - Qual worker gastou as requisições. Cada requisição de LLM fica pendurada no agent que a fez.
Usando a página
Arraste para mover, role para dar zoom,0 ou Ajustar para enquadrar, Espaço ou Pausar para congelar, clique num nó para ver detalhes. Os chips no topo mostram e escondem processos; a legenda embaixo mostra e esconde tipos de nó. A página segue o tema e o idioma do seu terminal.
Uma dash aberta no meio de uma execução começa pelo que está vivo agora (agents rodando, servidores MCP conectados, processos em background), e não do vazio.
Privacidade e segurança
Os eventos levam só metadados: nomes, tamanhos, durações, status, contagens de tokens. O que segue nunca sai do processo, e há teste garantindo cada item:- texto de prompt, a task dada a um agent, saída do modelo, texto de erro
- argumentos e saída de tool, argumentos e resultados de chamada MCP
- caminhos de arquivo tocados por uma tool
- caminho e query string de URL (onde viajam chaves de API e tokens de bot): só o hostname é mostrado
- a linha de comando de um processo: só o nome do programa, e só quando a primeira palavra é um programa e não uma atribuição
VAR=valor - a URL do browser ou qualquer coisa de uma página; o payload, a mensagem ou a saída de um job agendado
127.0.0.1 numa porta efêmera e, além disso:
- toda chamada de API exige um token aleatório gerado no start. Ele chega à página pelo endereço uma única vez, vai para a memória e some da barra de endereço;
- toda requisição precisa trazer o
Hostexato em que o servidor subiu, o que fecha DNS rebinding a partir de uma página web; - só
GET, Content-Security-Policy estrita, sem CDN, sem chamadas de rede.
Custo
Com a dash desligada, cada ponto instrumentado custa um load atômico, e o processo faz umstat a cada dois segundos para conferir o lease. Nenhum span é montado, nenhum corpo é embrulhado.
Gravando, emitir nunca bloqueia: fila cheia descarta o evento e conta o descarte, e um consumidor lento perde eventos em vez de atrasar os outros. /dash status e /config dash mostram publicados e descartados.
Armazenamento
Cada processo grava em~/.chatcli/pulse/<instância>/ em segmentos rotacionados por tamanho, limitados a cerca de 16 MB por processo, com um heartbeat que separa processos vivos de mortos. Spools de processos mortos são removidos após 24 horas, no boot e sob demanda:
/storage na referência de comandos.
Configuração
/config dash mostra a variável, se este processo está gravando, o diretório do spool e os contadores de eventos.