Estudo técnico para o Fernando
Mari e Kimi:
os três desenhos, e
qual deles resolve

Segunda rodada, 4 de setembro de 2026, pelo Paulo. Você respondeu, e a pergunta mudou. Tudo que estava aqui continua abaixo, com duas correções marcadas. Novo nesta rodada: a apuração do que houve ontem, a medição dos 71 subagentes e um segundo teste de bancada. Nada da configuração da Mari foi tocado.

Você já tem o socorro. Ele só estava olhando pro lado errado.

Ontem foi queda da Anthropic, não limite seu, e isso muda o remédio. Dos três desenhos que você pediu, um não existe do jeito imaginado, outro já está construído aqui e o terceiro eu testei hoje. O conserto que resolve os 98 minutos de ontem é uma lista de padrões, não um provedor novo.

Ontem caiu de verdade, e não foi teto de conta
Incidente aberto pela Anthropic, impacto maior, 2h50, com o Opus 5 na lista dos afetados. Aqui do lado apareceram 8 erros de servidor no mesmo intervalo e zero erro de limite. Você mandou 4 mensagens sem resposta e ficou 98 minutos sem ela.
A redundância já está instalada, e ficou parada
Tem contingência montada aqui, com o Codex, que é outro provedor. Ela não entrou porque só reconhece texto de limite de uso: não tem uma linha pra 500 nem pra 529. Olhou a tela cheia de erro e não viu nada.
Subagente no Kimi com a Mari no Claude não existe
Li dentro do binário: o endereço do servidor é do processo inteiro e o subagente não tem onde declarar provedor. A variável troca o nome do modelo, não o endereço. Só sai com um proxy escrito por nós na frente de tudo que ela fala.
Frota separada funciona, e eu provei hoje
Processo à parte, ambiente próprio, sem enxergar memória nem chave. Rodou contra um servidor falso com 25 ferramentas e cache atravessando, enquanto a Mari seguia trabalhando ao lado sem sentir nada.
Testei rodei aqui e li a saída
Doc oficial li na fonte da Moonshot
Suposição raciocínio meu, não medi

Você respondeu, e a pergunta virou outra

A frase que você mandou junta duas coisas que não têm o mesmo remédio. Separei, porque uma delas eu consegui provar ontem e a outra eu consegui medir.

O que você escreveu

A ideia é rodar lado a lado, pra multiplicarmos a força tarefa em demandas múltiplas quando o Claude tem sobrecarga e fica fora do ar (como ontem).

Tem dois problemas dentro dessa frase, e eles pedem coisas diferentes. Um é ficar sem ninguém. O outro é ter gente demais pra pouca mão.

Problema 1
Você fica sem Mari
O Claude cai, ela emudece e você fala sozinho. Aconteceu ontem, e eu fui atrás do registro pra saber se foi queda deles ou teto seu. Seção 8.
Problema 2
Cinco pedidos ao mesmo tempo
Você manda cinco coisas juntas e a fila anda devagar. Aqui o gargalo não é a cabeça dela, é o braço, e isso eu consegui medir. Seção 9.

Sua leitura sobre o gargalo está certa

Você escreveu que a Mari já dispara vários subagentes em paralelo e que são eles que consomem o token. Confere, e o número é maior do que parece: nos últimos 7 dias saíram 71 subagentes, e eles sozinhos queimaram 666 milhões de tokens de entrada contra 2,84 milhões de saída. A mão de obra é quase toda a conta.

A parte que não confere é a solução. Você imaginou a Mari em Claude e a mão de obra em Kimi dentro da mesma sessão. Isso não existe, e eu vou mostrar exatamente onde trava.

Ontem caiu mesmo, e não foi limite seu

Essa era a pergunta que podia derrubar o plano inteiro. Fui em duas fontes independentes, o painel de status da Anthropic e o registro da própria sessão aqui na máquina. As duas batem.

Foi incidente da Anthropic, confirmado dos dois lados

Em 03/09 a Anthropic abriu Elevated errors for multiple models, impacto classificado como maior, atingindo claude.ai, a API e o Claude Code. A lista de modelos afetados que eles publicaram cita o Opus 5, que é o que a Mari roda. Duração de 2h50, das 10:26 às 13:16.

Do lado de cá, o registro da sessão dela tem 8 erros de servidor no mesmo intervalo: três 500 Internal server error e cinco 529 Overloaded. E o mais revelador: os três primeiros caíram 2 minutos antes de a Anthropic publicar o incidente. A Mari bateu na falha antes do painel de status contar.

Erro de limite de conta em 03/09: zero. Nenhuma ocorrência de usage limit, session limit ou 429 em nenhum dos 49 registros do dia.

O buraco de 98 minutos, hora a hora
Horário de Brasília · registro da sessão e do bot
10:13
Você pede o comparativo de assinatura digital. Ela responde às 10:16, tudo normal.
10:24
Primeiro 500 Internal server error. Mais dois nos segundos seguintes.
10:26
Só agora a Anthropic abre o incidente publicamente.
10:30
O monitor daqui dispara alerta, mas com diagnóstico errado: culpa contexto cheio ou crédito. Nenhum dos dois era verdade.
10:35
Você: tenta de novo... Sem resposta.
10:41
Você: ? Sem resposta.
10:46
Você: Mari, cade vc!? Sem resposta. Os 529 Overloaded seguem até 11:50.
11:30
Você: Mari, voltou à vida? Sem resposta. Quarta mensagem no vácuo.
11:55
Ela volta e responde. 98 minutos depois da primeira mensagem sua sem resposta.
12:09
Ela contorna sozinha: troca a Juliana de Opus para Sonnet e as entregas saem.

O socorro já existe aqui dentro, e ele não olhou pro lado certo

Tem uma contingência montada em /opt/mari-bot/contingency.py, com vigia rodando de 2 em 2 minutos. Quando ela dispara, quem responde é o Codex, que é OpenAI, provedor completamente diferente. Ou seja: a redundância de provedor já está instalada e paga.

Ela não entrou ontem por um motivo bobo. A lista de padrões que aciona o gatilho só reconhece texto de limite de uso: you've hit your session limit, usage limit, coisas assim. Não tem uma linha pra 500 nem pra 529. Ontem a tela estava cheia de 529 e o vigia olhou, não reconheceu e seguiu em frente.

Isso explica o alerta errado das 10:30. A frase que culpa contexto cheio ou créditos é texto fixo dentro de monitor-session-context.sh, escrito na mão. Não é medição, é chute, e ontem o chute apontou pro lado errado. Foi ele que fez todo mundo achar que era teto de conta.

Então conta isolada resolveria?

Não. Isso eu preciso corrigir do que ficou escrito aqui de manhã. Conta separada resolve teto de plano, e teto de plano não teve nenhuma participação ontem. Se você tivesse duas contas MAX, as duas teriam tomado 529 igual, porque o problema estava no servidor deles, não na sua cota.

Para dar tamanho: em 30 dias foram 8 falhas de servidor da Anthropic contra 1 episódio de limite de conta (26/08, janela de 5 horas, resolveu sozinho). O painel deles registrou 31 incidentes no período, 9 deles de impacto maior ou crítico. O problema recorrente é instabilidade do provedor. Redundância de provedor é a resposta certa. Só que você já tem uma.

Os três desenhos, um por um

Cada um com o passo a passo real, o que custa e onde quebra. Dois deles eu consigo derrubar com evidência, não com opinião.

Desenho A · Subagentes no Kimi, Mari no Claude

A mão de obra sai barata, a cabeça fica cara. Resolve o problema 2.
Não existe do jeito imaginado

Você perguntou se a variável vale por sessão, por agente, e se dá pra ter agente no Claude e agente no Kimi ao mesmo tempo. Fui ler o binário instalado, porque documentação envelhece e código não mente.

O que eu li dentro do executável
A variável vence o frontmatter, sim
Testei
Achei a função que resolve o modelo do subagente dentro do binário da versão que roda hoje, a 2.1.239. Ela lê CLAUDE_CODE_SUBAGENT_MODEL antes de tudo e só olha o frontmatter se a variável estiver vazia. O próprio código carrega os rótulos da ordem, nessa sequência: env, tool, frontmatter, inherit. Sua premissa está correta.
Só que isso inverte numa versão futura
Doc
A partir da 2.1.251 a ordem vira ao contrário e o frontmatter passa a ganhar da variável. Hoje a Mari está protegida porque o start.sh sobe com DISABLE_AUTOUPDATER=1, então a versão está presa. Mas um npm i -g distraído inverte esse comportamento sem avisar ninguém. Se um dia isso for montado, precisa de trava de versão explícita.
Delegação não morre calada. Eu errei nisso de manhã
Testei
Ficou escrito aqui que pedir um modelo inexistente mataria toda delegação em silêncio. Está errado. Na mesma função, quando o modelo não é reconhecido, ele cai no modelo do pai e registra o motivo, com nome e tudo: family_step_down ou parent_inherit. O fail silently da documentação da Moonshot é sobre configurar só parte das 9 variáveis, não sobre resolver modelo de subagente. Corrigido.
Aqui é onde trava de verdade
Testei
CLAUDE_CODE_SUBAGENT_MODEL troca o nome do modelo, não o endereço do servidor. Quem manda no endereço é ANTHROPIC_BASE_URL, e ela está na mesma lista de variáveis do processo, lida uma vez quando o programa sobe. A lista de campos que um subagente aceita no frontmatter não tem endereço nem provedor. Então subagente em outro provedor, na mesma sessão, não existe. Trocar só o nome é pedir kimi-k3 pra Anthropic, que não conhece esse modelo.

Misturar Claude e Kimi na mesma sessão: só com um porteiro no meio

A única saída seria subir um proxy aqui no servidor, apontar a Mari pra ele e deixar esse proxy decidir, pelo nome do modelo, se manda pra Anthropic ou pra Moonshot. É construível, não é mágica. Mas repare no que isso cria: um programa nosso, escrito por nós, na frente de toda chamada da Mari. Ele cai, ela para. E ele passa a ser mais um ponto de falha justamente num plano que nasceu pra ter menos pontos de falha.

Suponha que o proxy exista e funcione. A pergunta seguinte é a sua: quanto de dado sensível vai junto? Medi nos 71 subagentes reais dos últimos 7 dias, um por um, sem amostragem.

O que sai dentro de um subagente
71 subagentes · 28/08 a 04/09 · medido, não estimado
Briefings sem nenhuma credencial
71 de 71
O texto que a Mari escreve é limpo. Zero chave, zero senha, em todos.
Briefings totalmente limpos
27 de 71
38%. O que mais suja o resto é valor em reais e nome de cliente, não segredo.
CPF real dentro de briefing
1
Mais 5 nomes de pessoas reais, todos em emissão de boleto.
Agentes que abriram arquivo com credencial durante o trabalho
45 de 71
63%. O .env do bot foi lido por 20 deles, o da Mari por 18.
Agentes cujo conteúdo lido trouxe dado pessoal ou credencial
58 de 71
82%. Isso é o que efetivamente entrou no modelo, não o que foi pedido.
Agentes com segredo vivo, literal, no contexto
10
Chave da OpenAI, senha do Postgres de produção, duas chaves AWS e a chave da Evolution. Os 10 são o paulo-dev.
Agentes com execução 100% limpa
3 de 71
4%. Esse é o tamanho real do que dava pra mandar pra fora sem pensar.

O número que derruba o desenho A

A sua intuição era que mandar só o pedaço de cada agente limitaria o vazamento. Está certa no briefing e errada na execução: o briefing é inócuo, mas 85% dos subagentes tocam credencial ou dado de cliente enquanto trabalham, e isso vai inteiro pro modelo, com prompt limpo ou não.

Pior: a distribuição não colabora. O paulo-dev sozinho é 62% dos disparos e 78% de tudo que foi lido, e é onde apareceram 100% dos segredos vivos. É o agente que mais roda, o que mais precisa de raciocínio forte e o que menos pode sair daqui, as três coisas ao mesmo tempo.

Os que dariam pra mandar sem susto são o jonathan-copy e a juliana-ops (ela não abriu .env nenhuma vez em 10 execuções). Rafael, Davi e Flávio não rodaram uma única vez na semana. Esse recorte seguro é 17 dos 71 disparos e 8% do volume lido. Você montaria um proxy, assumiria um ponto de falha novo e um contrato de dados na China para tirar 8% da carga.

A conta, se os 71 subagentes fossem pro Kimi
Leitura de cache · 623,7 M a US$ 0,30/M
US$ 187,10
Gravação de cache · 42,4 M a US$ 3,00/M
US$ 127,15
Entrada sem cache · 12,1 mil
US$ 0,04
Saída · 2,84 M a US$ 15,00/M
US$ 42,60
Semana, só de subagente
US$ 357
Projetado no mês
US$ 1.530

Isso já é o cenário bom, supondo que a Moonshot tenha cache tão eficiente quanto o da Anthropic. Sem cache equivalente, a conta é sobre os 666 milhões brutos: US$ 2.041 por semana, US$ 8.746 no mês. Não consegui confirmar o cache deles na fonte, então trate a linha de cima como o melhor caso, não como o provável. Marquei como suposição de propósito.

Por que eu não faria
  • Não roda sem um proxy escrito por nós na frente de tudo que a Mari fala.
  • Hoje esses subagentes custam zero dólar a mais, porque cabem na assinatura que você já paga. Isso não economiza, isso cria uma fatura nova de pelo menos US$ 1.530 por mês.
  • O recorte que dá pra mandar com segurança é 8% do volume. Não muda sua vida.
  • O agente que resolveria o problema, o paulo-dev, é exatamente o que carrega senha de produção e o que mais precisa de raciocínio bom. O Kimi é fraco justamente em lógica pesada e depuração.

Desenho B · Uma Mari Kimi dormindo, como reserva

Sobe quando a principal cai. Resolve o problema 1.
Já existe, e não é com Kimi

Esse desenho já foi construído aqui, testado em produção e está rodando. Só que o cérebro reserva é o Codex, não o Kimi, e ele não é uma segunda Mari. Essa diferença é a resposta pro seu medo.

  1. O bot recebe sua mensagem e, antes de entregar pra qualquer um, chama route_if_blackout(). Esse é o único portão da casa.
  2. O portão olha a tela da Mari. Se está tudo bem, injeta nela e acabou. Se está em pane, não injeta.
  3. Em pane, o próprio bot chama o cérebro reserva com codex exec. É uma chamada só, que nasce e morre ali. Sem sessão, sem tmux, sem histórico próprio.
  4. A reserva te responde direto e joga o que não consegue fazer em pending.md, num bloco marcado [contingencia ...].
  5. Quando a tela limpa, o bot faz o inverso: build_catchup() escreve um recado e injeta na Mari contando que ela esteve fora e onde ler o que ficou pendente. O bastão volta sem buraco.

Tempo pra subir: nenhum, porque não sobe nada

Você perguntou se fica ligado o tempo todo ou sobe sob demanda, e quanto demora. A resposta é que a pergunta não se aplica nesse formato. Não existe processo dormindo esperando. O bot chama uma linha de comando na hora, com um limite de 240 segundos. Nada fica de pé consumindo recurso, e não tem tempo de partida.

O que está quebrado nele hoje

  • A detecção só enxerga limite de uso. Os padrões cobrem you've hit your session limit e parentes. Não cobrem 500, 529 nem Overloaded. Foi por isso que ontem ele ficou olhando pra tela cheia de erro e não reconheceu nada.
  • O vigia não arma sozinho. Ele detecta, avisa você e para. Ligar é decisão sua, no dedo, mandando /contingencia on. Isso foi uma escolha consciente de quem construiu, não um defeito, mas significa que ontem, mesmo se tivesse detectado, ele só teria mandado um aviso.
  • O Codex já falhou por permissão antes. Em 21/06 e 28/06 o registro mostra Permission denied no binário dele três vezes seguidas. Nunca foi testado depois disso. Não afirmo que funciona hoje: afirmo que existe e que precisa de um teste antes de alguém contar com ele.

Desenho C · Kimi como frota extra, sob comando dela

A Mari continua dona de tudo e chama reforço quando aperta. Resolve o problema 2.
Funciona, e eu provei hoje

A trava do desenho A é que endereço de servidor é do processo. Então a saída é óbvia e não precisa de proxy nenhum: em vez de tentar mudar o provedor dentro da sessão dela, você abre outro processo. Cada processo tem o ambiente dele e um não enxerga o outro.

  1. A Mari continua exatamente como está: Claude, assinatura MAX, dona da conversa, da memória e da decisão. Nada muda no lado dela.
  2. Quando o volume aperta, ela dispara um processo separado com ANTHROPIC_BASE_URL apontando pra Moonshot e a chave do Kimi. Esse processo nasce com o ambiente dele, não com o dela.
  3. Esse processo roda numa pasta de trabalho isolada, sem leitura de /opt/mari/memory, sem .env e sem os CSV de lead. A trava é permissão de arquivo, não instrução no texto.
  4. Ele devolve o resultado num arquivo. A Mari lê, confere e entrega pra você. Ela continua sendo a única voz.
O teste que eu rodei hoje pra provar isso
Subi um servidor falso em 127.0.0.1:8793 e apontei um Claude Code isolado pra ele, com ambiente próprio e pasta própria, enquanto a Mari seguia trabalhando ao lado.
Passou
# o que o servidor falso recebeu path : /v1/messages?beta=true model : kimi-k3 auth : Bearer sk-fake-bench tools : 25 cache : cache_control presente
Foi tudo pro endereço falso. As 25 ferramentas atravessaram, o cache atravessou, o nome do modelo foi respeitado e a chave viajou no cabeçalho certo. E a Mari, no processo ao lado, não sentiu nada: perfil continua max, os 7 agentes continuam em claude-opus-5 e a sessão dela seguiu viva o tempo todo.
Por que esse é o que eu levaria adiante
  • Não depende de nada que a Anthropic ou a Moonshot precisem construir. É comportamento normal de processo do sistema operacional, e eu testei hoje.
  • Não tem proxy no meio, então não cria ponto de falha novo na frente da Mari.
  • O vazamento é controlado por permissão de arquivo, que é trava de verdade, não por confiar que o agente vai se comportar.
  • Você liga e desliga quando quiser. Não ligou, não gastou.
  • É a mesma ideia que já estava escrita na recomendação de manhã (Kimi no meu lado, não no dela), só que agora com o teste feito e o passo a passo escrito.
CritérioA · subagenteB · reservaC · frota
Roda hoje, sem construir nada?Não, precisa de proxyExiste, mas cego pra quedaSim, testado hoje
Qual problema atacaCapacidadeRedundânciaCapacidade
Base de dados sai daqui?Sai, em 85% dos casosSai a memória e o históricoSó o que ela mandar
Custo novo por mêsUS$ 1.530 a 8.746Quase nada, é sob demandaVocê decide o quanto usar
Ponto de falha novoProxy na frente de tudoNenhumNenhum
Duas Maris disputando saídaNãoSó se fizer erradoNão

Arraste a tabela pro lado se estiver no celular.

As duas Maris brigando pelo outbox

Esse era o ponto que mais te preocupava, e com razão: já aconteceu aqui. A resposta curta é que o problema não se resolve com cuidado, se resolve com desenho. E o desenho certo já está montado.

Por que trava de boa vontade não funciona

Em 01/08 o reinício da Mari não matou a sessão anterior. A antiga ficou num estado torto e perigoso: parou de receber suas mensagens, porque o bot injeta só na sessão nova, mas continuou escrevendo no outbox. Você recebeu duas mensagens de boot quase iguais, de duas Maris que não sabiam uma da outra.

Guarde esse detalhe, porque ele mata metade das soluções óbvias: a sessão problemática é justamente a que parou de escutar. Qualquer trava que dependa dela conferir alguma coisa antes de escrever falha exatamente no caso em que você precisa dela. Trava que o processo doente precisa respeitar não é trava.

O mecanismo que funciona: um porteiro, não duas travas

Em vez de deixar dois escritores e tentar coordená-los, o desenho que já está aqui garante que só exista um. Toda mensagem sua passa por um único ponto no bot, o route_if_blackout(), e é ele que decide quem responde. Ele escolhe um, nunca os dois, e o outro nem fica sabendo que chegou mensagem.

E a reserva foi feita de propósito sem sessão própria. Ela não tem tmux, não tem contexto que continua vivo, não tem memória. Nasce quando o bot chama, responde e morre. Um processo que não fica de pé não tem como brigar por nada.

A mensagem passa por um único portão no bot, que escolhe entre a Mari e o cérebro reserva, e só um dos dois responde Telegram mensagem do Chefe bot.py · portão único route_if_blackout() escolhe UM, nunca os dois tela limpa em pane Mari no tmux Claude, sessão viva memória e histórico a dona de tudo cérebro reserva sem sessão sem memória nasce e morre na hora uma saída só você recebe uma resposta A volta do bastão o que a reserva não fez vai pro pending.md e o bot avisa a Mari quando ela volta

Não tem duas Maris porque não pode haver duas. O portão está antes da bifurcação, e a reserva não tem onde morar.

Se você ainda quiser duas sessões vivas, o mínimo seria isto

Você pediu mecanismo, não recomendação de cuidado. Então, se em algum momento existirem mesmo dois processos de pé, essas quatro travas são o piso, e todas elas são de sistema, não de combinado:

  • Dono em arquivo, com flock. Um arquivo de posse que só um processo consegue segurar por vez. Esse padrão já é usado aqui: tem tasks.json.lock e vários cron rodando com flock -n. Quem não segura o arquivo não escreve.
  • Saída separada por dono. Cada sessão escreve numa pasta própria, e o bot só esvazia a pasta de quem está com a posse. Assim a sessão órfã pode escrever à vontade: ninguém lê.
  • Reserva sem permissão de escrita na memória. Não é pedir pra não escrever, é tirar a permissão do arquivo. A única coisa que ela pode fazer é acrescentar linha marcada no pending.md, que é o que a contingência já faz.
  • O bot escolhendo o alvo. Hoje ele tem TMUX_SESSION, um nome só, no singular, e ele é usado em quase toda função que fala com a Mari. Pra existir um segundo painel, isso vira lista e nasce a função que decide o alvo. Isso é reescrever o miolo do bot, não configurar.

Eu não recomendo esse caminho. As quatro travas existem só para consertar um problema que o desenho atual simplesmente não tem, e a quarta é uma cirurgia no arquivo mais crítico da casa. Duas sessões vivas é a única forma de recriar o incidente de 01/08 de propósito.

Minha recomendação, atualizada

Mudou do que estava escrito aqui de manhã, e mudou por evidência nova: ontem foi queda deles, não teto seu.

O que eu disse de manhã e não vale mais

Estava escrito aqui que o remédio pro seu medo era isolar a Mari em conta própria. Isso partia de uma suposição que agora está desmentida: a de que você ficava sem ela por estourar limite. Ontem não foi limite, foi servidor deles fora do ar, e conta separada não teria mudado nada. Risquei essa recomendação.

O que eu faria, nessa ordem

Consertar o socorro que você já tem. Depois, se ainda quiser fôlego, o desenho C.

Os seus dois problemas têm dois remédios diferentes, e nenhum dos dois é trocar o motor da Mari.

Pro problema 1, redundância: você já tem um cérebro reserva instalado, de outro provedor, e ele ficou parado ontem porque só sabe reconhecer texto de limite de uso. Ensinar ele a reconhecer 500 e 529 é mexer numa lista de padrões que já existe. Isso é o conserto mais barato do documento inteiro e ataca o problema exato que te deixou 98 minutos falando sozinho.

Pro problema 2, capacidade: o desenho C, que eu testei hoje e funciona. Frota separada, em outro processo, sem enxergar a memória nem as chaves, chamada quando aperta. Sem proxy, sem ponto de falha novo, sem mexer em nada do lado dela.

Uma Mari inteira no Kimi eu continuo não recomendando, e agora com um motivo a mais: ela emprestaria ao Kimi o único papel que o Kimi faz pior, que é julgar e decidir com você.

Na ordem em que eu tocaria, e o que cada um custa
  • 1. Ensinar o vigia a ver queda de servidor. Acrescentar os padrões de 500, 529 e Overloaded na lista que aciona a contingência. Mesma trava de duas confirmações que já existe, pra não disparar à toa.
  • 2. Testar o Codex antes de contar com ele. O registro mostra Permission denied nas últimas três tentativas reais, em junho. Nunca foi validado depois. Não adianta consertar a detecção se o reserva não liga.
  • 3. Consertar o alerta que mente. A frase que culpa contexto cheio ou créditos é texto fixo escrito na mão. Ontem ela apontou pro lado errado e foi o que fez todo mundo achar que era limite de conta.
  • 4. Só então, se quiser fôlego, montar a frota Kimi. Pasta isolada, sem .env e sem base de lead, ligada quando você mandar. Uma tarde de trabalho, e desligar é parar de chamar.
O que eu preciso de você
  • Autorização pros itens 1 a 3, que são no bot e no vigia. Não encostei em nada disso, só li.
  • Uma decisão sobre o item 4, que envolve comprar chave do Kimi e mandar trabalho pra fora.

Da primeira rodada, mantido

Tudo abaixo é o levantamento que você já leu hoje de manhã, palavra por palavra. Continua valendo, com duas ressalvas que ficaram marcadas lá em cima: a delegação não morre calada (seção dos desenhos) e conta isolada não era o remédio (seção da recomendação).

O que mudou desde julho

O levantamento de 19/07 continua de pé no essencial, mas envelheceu em dois pontos que fariam a configuração falhar se você copiasse do jeito que está anotado.

Anotação de julho contra a doc de hoje
O endereço da API mudou
Testei
Estava anotado api.kimi.com/coding/. A doc de hoje manda https://api.moonshot.ai/anthropic. Bati nos dois daqui do servidor, sem chave: os dois respondem, com o erro certinho de chave inválida. O velho não morreu, só saiu da documentação. Ficar no endereço que a doc não cita mais é apostar contra.
A variável da chave mudou
Doc
Não é mais ANTHROPIC_API_KEY, é ANTHROPIC_AUTH_TOKEN. E a doc avisa que ele tem precedência sobre o login salvo, que é exatamente como a Mari está autenticada hoje. Se sobrar a variável velha no ambiente, dá conflito.
Não são mais 3 variáveis, são 9
Doc
A doc é literal sobre isso: "Configuring only some of the variables makes the corresponding scenarios fail silently." Configurar pela metade não dá erro, dá silêncio. Guarde essa frase, ela volta na seção 2.
O roster é outro
Doc
kimi-k3[1m] com 1.048.576 de contexto, kimi-k2.7-code e kimi-k2.6 com 256 mil. O k2.7 exige o modo Thinking ligado, senão devolve erro 400 em toda chamada.
O preço da tabela é o mesmo
Doc
kimi-k3: US$ 3,00 por milhão de entrada, US$ 0,30 quando bate no cache, US$ 15,00 de saída. Isso confere com o que estava anotado. O que ninguém tinha feito era multiplicar pelo seu uso, e é onde a coisa vira.
Não tem bloqueio pra chegar lá do Brasil
Testei
Chamei o endpoint deles daqui da VPS agora: respondeu em 0,7 segundo. Sem VPN, sem proxy, sem geobloqueio. O caminho está aberto, o que decide é se a gente quer mandar a base por ele.

Sobre a assinatura fechada deles

Os planos mensais do Kimi Code começam em US$ 19 e vão até US$ 199. Não consegui abrir a tabela oficial de planos hoje, a página é um aplicativo e não entrega o conteúdo pra leitura. O que achei em fonte de terceiro, e por isso trato como não confirmado, é que em julho as quatro faixas pagas apareceram esgotadas por falta de GPU, com reabertura em lotes. Antes de contar com plano fechado, alguém precisa abrir a página logado e confirmar se dá pra comprar.

O teste que eu rodei

Em vez de acreditar na doc, montei um endpoint falso numa pasta temporária, apontei uma instância limpa do Claude Code pra ele e li o que sai do outro lado. Sem chave da Moonshot, sem instalar nada, sem encostar em /opt/mari.

A pergunta que importava era uma só. Os seus sete subagentes, Juliana, Paulo, Flávio, Jonathan, Rafael, Pedro e Davi, têm model: claude-opus-5 cravado no cabeçalho do arquivo. O Kimi não tem nenhum modelo com esse nome. O que acontece quando a Mari delega?

Bancada · o que o Claude Code manda pro endpoint
Agente de teste com model: claude-opus-5 no cabeçalho, igual aos seus. Cada linha é uma chamada real capturada.
Rodada 1 · só as 3 variáveis de julho
// turno principal da Mari {"model": "kimi-k3"} // ela delega pro subagente: {"model": "claude-opus-5"} ^ modelo que nao existe la
O cabeçalho do agente vence e o Claude Code manda claude-opus-5 pra Moonshot. Modelo que não existe lá. Toda delegação morre. E lembra da frase da doc, fail silently: não aparece erro vermelho, o subagente simplesmente não entrega. A Mari é uma orquestradora que não executa nada sozinha, então perder a delegação é perder ela inteira.
Rodada 2 · com as 9 variáveis da doc nova
// mesmo agente, nada editado {"model": "kimi-k3"} ^ o subagente vive
Com CLAUDE_CODE_SUBAGENT_MODEL definido, o mesmo subagente vira kimi-k3. A variável sobrescreve o cabeçalho do arquivo. Não precisa editar os sete agentes, e isso é a melhor notícia do estudo.

O que mais o teste mostrou

Ferramentas e cache atravessam
Testei
O turno principal foi com 25 ferramentas declaradas e cache_control no corpo. O protocolo passa inteiro, em SSE. Ler arquivo, rodar comando, editar, buscar na web, tudo isso é ferramenta e chega lá.
O sufixo [1m] é do Claude Code, não vai na chamada
Testei
Você configura kimi-k3[1m], mas o que sai no corpo da requisição é kimi-k3 limpo. O colchete é anotação de janela de contexto pra CLI. Funciona, só não se assuste ao ver diferente no log.
Aparecem avisos, e eles não travam nada
Testei
A cada chamada sai [claude-code:unrecognized_model] no terminal. É cosmético, a conversa continua. Mas vai sujar o painel da Mari, e o bot do Telegram lê esse painel pra saber se ela está ocupada. Volto nisso na seção 3.

A integração das bases

Sua pergunta central. A resposta curta é que não existe integração pra fazer, porque quase tudo já é arquivo em disco e arquivo não pertence a modelo nenhum.

Em uma linha

Não tem o que integrar. A memória da Mari é arquivo em disco e uma API HTTP local, então uma Mari apontada pro Kimi lê tudo no primeiro segundo, sem exportar, sem converter e sem plugin. O que não atravessa é uma variável de ambiente, não uma base.

Item por item

Atravessa sem trabalho nenhum
CLAUDE.md, knowledge/ e memory/
Texto puro no disco. 14 KB de regras, 22 MB de conhecimento em 215 arquivos, 1,6 MB de memória em 103 arquivos. O Claude Code lê CLAUDE.md sozinho e o resto ela abre com as ferramentas normais. Zero adaptação.
A auto-memória
São 185 arquivos Markdown com cabeçalho, 1,7 MB, em /home/mari/.claude/projects/-opt-mari/memory/. É o formato do Claude Code, mas é Markdown legível. Se o carregamento automático não vier, ela lê na mão como qualquer pasta.
A busca semântica e o Postgres
A API da porta 3007 respondeu agora, com resultado. É POST em HTTP local, o modelo nem sabe que ela existe, só chama. O banco mari_memory tem 12.770 mensagens de histórico e se acessa por psql. Os dois funcionam igual atrás de qualquer modelo.
As 22 skills
Suposição
Também são pastas com Markdown, em ~/.claude/skills/. O carregamento é da CLI, não do modelo, então elas aparecem. O que eu não medi é se o Kimi obedece a uma skill longa como a impeccable ou a humanizer com a mesma fidelidade. Carregar é uma coisa, seguir é outra.
Os ganchos de segurança
O security-scan.py e o rastreador de tarefas são scripts Python disparados pela CLI antes das ferramentas. Continuam rodando igual, e essa é uma boa notícia: a varredura de comando perigoso não depende do modelo.
MCP
Não é problema porque hoje não tem nenhum servidor MCP ligado. Procurei em ~/.claude.json e no projeto: a lista está vazia nos dois. O acesso a Google que a Mari usa hoje sai por script próprio com o token em /opt/credentials/, ou seja, é Python, roda igual.
Não atravessa, ou atravessa torto
Os 7 subagentes com modelo cravado
Testei
O caso da seção 2. Sem CLAUDE_CODE_SUBAGENT_MODEL, todos os sete morrem calados. Com ela, todos funcionam sem editar arquivo. É a única coisa que separa "funciona" de "parece que funciona".
O bot do Telegram lê a tela dela
Suposição
O bot em si é agnóstico de modelo: ele injeta texto na sessão tmux chamada mari e lê arquivos JSON da pasta outbox. Nunca menciona modelo. Só que, pra saber a hora de injetar, ele tira uma foto do painel e procura palavra como thinking e o cursor . O Kimi é descrito como verboso, com raciocínio sempre ligado, e ainda imprime unrecognized_model a cada chamada. Se isso deixar o painel parecendo ocupado o tempo todo, o bot para de entregar as suas mensagens pra ela. Não testei com Kimi de verdade, mas é o ponto que eu checaria primeiro no dia 1.
A janela de contexto e o compact
Suposição
A doc manda CLAUDE_CODE_AUTO_COMPACT_WINDOW em 1 milhão. Isso muda o ritmo de reinício da Mari e toda a rotina de restart que ela tem hoje foi calibrada em cima de outra janela. Não quebra, mas descalibra.

O que vaza, em número

A ressalva de julho continua valendo e ficou mais séria agora que dá pra medir. A Moonshot treina os modelos com o que recebe e não oferece opção de recusar. Contei com grep, não por impressão.

Só o pacote que ela carrega ao acordar
421.158 bytes · 4.531 linhas · vai inteiro na primeira mensagem
Telefones de gente
20
40 aparições, 20 números distintos. Lead, aluno, sócio, fornecedor.
E-mails
13
22 aparições, 13 endereços distintos.
CPF completo
7
Formatados, prontos pra uso. Quase todos em decisions.md.
CNPJ
15
CFS Educação e Financie, incluindo contexto de contrato.
Senhas com o valor escrito
5
Isso é o que mais me incomoda. São credenciais legíveis dentro do texto de memória.
Valores em reais
355
Preço de produto, ticket de contrato, verba de tráfego, faturamento.
Chaves de API no formato de segredo
0
No pacote de boot não achei nenhuma. As chaves ficam no .env, que não entra sozinho.

Mas o boot é só a porta de entrada

A Mari não vive do boot. Ela trabalha, e tudo que ela abre no dia vira mensagem pra Moonshot. O alcance real do primeiro mês de uso é este:

  • 14 arquivos em knowledge/ com chave de API de verdade dentro, no formato de segredo. São os backups de fluxo do n8n e dois contratos em HTML.
  • 254 e-mails e 56 telefones espalhados pelo knowledge/, fora do pacote de boot.
  • O .env do projeto, com 29 linhas de credencial, que ela lê toda vez que precisa de um token.
  • 382 linhas de lead em planilha CSV na raiz, com nome e telefone de comprador.
  • As 12.770 mensagens do histórico no Postgres, que é onde está toda conversa que vocês já tiveram.

E se filtrar tudo antes?

Fiz a conta. Das 4.531 linhas do pacote de boot, 371 carregam pessoa, dinheiro ou credencial. São 8,2%, e num primeiro olhar parece ótimo: sobrariam quase 92% do texto.

Só que a leitura correta é a inversa. Essas 8,2% são justamente as linhas que decidem alguma coisa. Quem é o lead, quanto custa, qual contrato está em pé, qual senha abre qual sistema. Tire isso e sobra a Mari sabendo trabalhar sem saber sobre o quê.

O núcleo que é 100% limpo de verdade, sem nenhum dado de pessoa nem valor, são o CLAUDE.md e o SOUL.md juntos: 15,2 KB, ou 3,6% do pacote. Essa é a Mari filtrada honesta. Ela tem personalidade, tom, protocolo de trabalho e nome dos subagentes. E não tem negócio nenhum dentro.

Quanto custaria de verdade

Aqui não é estimativa. Abri os registros de sessão da Mari e dos subagentes dos últimos 7 dias, somei token por token e apliquei a tabela publicada do kimi-k3.

Se a semana passada tivesse rodado no Kimi

7 dias reais, 13 sessões da Mari e 67 execuções de subagente, na tabela de US$ 3,00 de entrada, US$ 0,30 de cache e US$ 15,00 de saída.

US$ 2.569projetado no mês, a partir de US$ 597,45 medidos em 7 dias
Mari, sessão principalUS$ 258,57
Os 67 subagentesUS$ 338,88
Entrada nova somada66,1 M tokens
Cache lido somado1.103,3 M tokens
Saída somada4,5 M tokens

O que domina a conta é o cache: mais de 1,1 bilhão de tokens relidos na semana, porque cada turno relê o contexto inteiro dela. Cobrei isso pelo preço de cache-hit deles, que é o mais barato possível. Se o cache do Kimi funcionar pior que o do Claude, a conta só sobe.

Isso derruba a premissa que abriu o assunto

Em julho o motivo de olhar pro Kimi foi o medo de estourar a cota do MAX e te deixar sem Mari. Só que a Mari é justamente a carga mais pesada que roda aqui. Botar ela no Kimi é pegar a conta que hoje está coberta por uma assinatura fechada e transformar em conta por token, na peça que mais consome.

O plano fechado deles não salva: a faixa mais cara é US$ 199 por mês, com cota semanal. Esse consumo passa por cima de qualquer uma das faixas nos primeiros dias.

Os dois caminhos

Os dois são executáveis. Descrevi cada um até o fim, com o que ganha e o que perde, pra você decidir com o preço na mão.

Caminho A · a Mari inteira no Kimi

Mesma pasta, mesma base, mesmo bot. Troca só o motor.
  1. Comprar crédito na Moonshot e gerar a chave. Sem camada gratuita.
  2. Criar /opt/mari/.claude-profiles/kimi.sh. O gancho já existe: o start.sh dela lê o arquivo active e carrega o perfil correspondente. Hoje está em max.
  3. Escrever no perfil as 9 variáveis da doc, não as 3 de julho, e limpar ANTHROPIC_API_KEY e CLAUDE_CODE_OAUTH_TOKEN pra não brigar com o login atual.
  4. A que não pode faltar de jeito nenhum é CLAUDE_CODE_SUBAGENT_MODEL. Sem ela, os sete subagentes param em silêncio.
  5. Trocar o conteúdo de active pra kimi e reiniciar. Voltar pro Claude é escrever max de novo. O rollback é uma palavra num arquivo, e isso é o que torna o teste barato.
  6. Vigiar o bot no primeiro dia. Se ele parar de injetar suas mensagens, é a leitura de tela contra a verbosidade do Kimi, não o modelo.
O que vai embora, sem tirar nada
  • Os 421 KB de boot com 20 telefones, 13 e-mails, 7 CPF, 15 CNPJ e 5 senhas, a cada vez que ela acorda.
  • Todo arquivo que ela abrir pra trabalhar, incluindo o .env com 29 credenciais e os CSV de comprador.
  • Toda mensagem que você mandar por Telegram, porque tudo passa pelo modelo.
  • O que sair do Postgres, que é a memória de tudo que vocês já conversaram.
  • E vai pra dentro do treino deles, sem opção de recusar.

Caminho B · uma segunda Mari, limpa e isolada

Instância separada, pasta própria, base sem pessoa e sem segredo.
  1. Pasta nova, tipo /opt/mari-kimi, com cópia do CLAUDE.md e do SOUL.md e mais nada de memory/. São os 15,2 KB limpos.
  2. Do knowledge/, levar só o que é método e processo. Ficam de fora contratos, backup do n8n e qualquer pasta com dado de cliente.
  3. Subagentes próprios, com model apontando pro Kimi desde o cabeçalho, em vez de depender de variável.
  4. Segundo bot do Telegram, com token próprio, pasta outbox própria e TMUX_SESSION própria. O bot já lê esse nome do ambiente, então dá pra separar sem mexer no código.
  5. Sem acesso ao Postgres, sem .env da casa, sem /opt/credentials. Se ela não pode ler, não pode vazar.
O que essa aí consegue fazer
  • Código genérico, script solto, prova de conceito, rascunho de página, pesquisa pública.
  • Rodar em paralelo com a Mari de verdade, sem disputar nada, desde que tenha bot e sessão próprios.
  • Absorver a carga do seu uso pessoal de programação, que era o problema original de julho.
O que ela não consegue
  • Não sabe quem é lead nenhum, quanto custa nada, o que foi decidido quando. Sem memória de negócio, não dá pra chamar de Mari.
  • Não toca CRM, não toca tráfego, não toca lançamento, não toca cobrança.
  • Na prática, o que sai daí é um bom cavalo de código com o jeito dela de falar. Exatamente o que já tinha sido decidido em julho.

Se as duas rodarem juntas, o que elas disputam

Essa parte a casa já aprendeu na dor, duas vezes. Rodar duas Maris na mesma pasta e no mesmo bot não é conviver, é colidir:

  • A pasta outbox. Não existe dono único na saída. Qualquer processo com acesso a ela fala com você. Em 01/08 uma sessão órfã continuou mandando mensagem depois do restart e você recebeu dois boots quase iguais de duas Maris que não sabiam uma da outra.
  • A sessão tmux. O bot injeta só na sessão chamada mari. A segunda instância não recebe você, mas continua respondendo. É o pior formato possível: surda e falante.
  • Os arquivos. Em 27/07 duas Julianas editaram o mesmo index.html em minutos, o preço mudou duas vezes e a página quebrou com erro de JS. Nenhuma das duas errou, o erro foi na distribuição.
  • O banco e os crons. As duas escrevendo no mari_memory e disparando as mesmas rotinas na mesma hora.

Por isso, no caminho B, bot próprio e sessão própria são o que faz o paralelo existir. Sem os dois, não tem paralelo, tem briga.

De onde tirei cada coisa

Documentação oficial da Moonshot lida hoje. Números do servidor contados com grep e com leitura dos registros de sessão. O teste de bancada rodou em pasta temporária, com endpoint falso, sem chave e sem tocar em /opt/mari.

Uma coisa eu não consegui confirmar na fonte: a tabela de planos fechados. A página de preço deles é um aplicativo e não entrega o conteúdo pra leitura automática. A faixa de US$ 19 a US$ 199 e a notícia de faixas esgotadas em julho vieram de fonte de terceiro e por isso estão marcadas como não confirmadas no texto. Isso não muda a recomendação, porque o consumo medido passa por cima de qualquer uma das faixas.