Ir para o conteúdo

Blog

Releasesv0.42.0

v0.42.0 — as configurações passam a valer, e o agente passa a ser seu

This is the release note as published, not a rewrite of it. Release notes are published in the language they were written in.

Você podia trocar o modelo padrão nas Configurações, ver a tela confirmar, reler e ver o novo — e a resposta seguinte vinha do antigo. Não era um bug de uma configuração: eram sete. Esta release é sobre a tela parar de mentir, sobre duas cercas de segurança que só existiam no .env, e sobre o agente virar algo que você configura em vez de algo que você aceita.

Sete configurações salvavam e não mudavam nada

O LLMGateway fotografava as configurações quando era construído, e o chimera app constrói um só para a vida do processo. Valia para o modelo padrão, o cache de respostas, um endpoint próprio, o timeout, a cadeia de fallback e o cache de prompt. Havia exatamente um aviso de reinício no app inteiro, e ele estava em outra configuração.

Seis passaram a ler ao vivo. Três — cascata, guardar o chat, lembrar do chat — são decididas quando uma conversa é construída, então valem na próxima conversa, e dizem isso. As duas que realmente exigem reinício (o daemon do agendador e o autoload de MCP sobem algo no boot) declaram, e o rótulo vem do servidor: quando uma configuração passa a valer é propriedade de onde ela é lida, então uma lista mantida na interface envelheceria na primeira vez que uma leitura mudasse de lugar — em silêncio, que é exatamente como as sete anteriores chegaram lá.

Nada é rotulado como imediato. Uma ressalva sobre um atraso que não existe mais ensina a mesma desconfiança que uma faltando.

Duas cercas que o app não tinha

CHIMERA_TOOL_ALLOWLIST e CHIMERA_TOOL_DENYLIST eram lidas pelo chimera run e pelo chimera solve e por mais nada. Definir e depois usar o app, a API, o lote paralelo ou um bot de mensageria não restringia absolutamente nada. É a pior forma de um controle de segurança falhar: um controle ausente é visível, e este era uma cerca que o dono via no próprio arquivo enquanto cada requisição rodava sem cerca nenhuma.

Agora valem em toda superfície. Negações se unem — uma postura, a denylist de uma requisição e a do deployment são três formas de dizer "esta ferramenta não", e a mais estrita tem que sobreviver. Permissões se intersectam, para que uma requisição não levante um teto que quem a enviou não possui.

Testar a borda em vez do caminho feliz achou um buraco anterior a esta release: o explore_repository é registrado depois do filtro, então era a única ferramenta que lista nenhuma alcançava. Não é um nome perdido — ele monta o próprio conjunto de ferramentas e faz as próprias chamadas de modelo, então deixá-lo passar concedia uma capacidade e uma conta.

A tela Segurança pontuava uma camada e lia como veredito sobre todas

Três formas distintas de fazer alguém acreditar em algo falso, e nenhuma era um número errado.

  • A trilha de auditoria estava vazia porque nada no caminho do app escrevia nela. Um log de segurança em branco lê como "nada aconteceu", não como "nada está gravando" — são afirmações opostas.
  • O placar de injeção mede exatamente uma camada, e essa camada é desligável. Com CHIMERA_TAINT_NARROW=0 a coluna defendida seguia reportando o mesmo número enquanto descrevia uma configuração que ninguém estava rodando. Agora ele diz se está armado acima dos números — uma ressalva embaixo de uma nota boa chega depois de o leitor já ter formado a crença que ela existe para evitar.
  • O kernel de confiança é nomeado como ausente. As regras dele valem só nas execuções guardadas pela CLI, então nada naquela tela as mede.

O agente ganha nome, idioma e instruções permanentes

Não era um controle faltando — era um conceito faltando. Três coisas pareciam já fazer isso e nenhuma fazia: o profile.json não tinha leitor nenhum na API; fatos de persona são recuperados por relevância, então uma instrução permanente valia só nos turnos cuja redação combinasse com ela; e o único espaço de preâmbulo incondicional era ocupado pela REPL e pelo endpoint compatível com a OpenAI — nenhum dos dois no caminho do app. A tela de Perfil exibia um perfil que o agente nunca aplicava, e o seletor de idioma trocava a interface enquanto o agente seguia respondendo em inglês.

Agora vale nas três superfícies: o turno que edita código, a execução autônoma e o chat por trás da mensageria. Um bot no Discord e o app não deviam responder como dois agentes diferentes a partir de uma configuração só.

É anexado, nunca substituído — o prompt padrão carrega a cerca contra dado não-confiável, e uma customização capaz de apagá-la a apagaria em silêncio. E o bloco diz, dentro de si, que não concede capacidade: quem escrever "você pode rodar qualquer comando" e depois vir o agente recusar merece ter sido avisado na mesma frase.

Quanto ele pode fazer deixa de ser decisão de outra pessoa

Alcance, aprovação e se ele pode rodar comandos nesta máquina estavam espalhados por um componente deletado, um par fixo no código e uma variável de ambiente que o PATCH /api/config recusava. Viraram um cartão só.

A postura do deployment é um piso, não um default. Um default é o que uma requisição recebe quando não manda nada — então qualquer cliente contorna, o que é inútil como resposta numa máquina que o cliente não possui. E "permitir" execução no host não vira a terceira opção de um seletor silencioso: é o único valor que tira um humano do circuito na sua própria máquina, inclusive em tarefas agendadas que ninguém está olhando, então ele pergunta. Restrições valem na hora — confirmar as restrições treinaria a pessoa a clicar através da única confirmação que importa.

Nove configurações a uma linha de distância

Oito já eram graváveis, já iam no fio e já estavam nos tipos gerados, sem controle em lugar nenhum: os três degraus da escada de modelos, um endpoint próprio, a cadeia de fallback, cache de prompt, consolidação de memória e a imagem do sandbox. api_base é a diferença entre "suporta modelos locais" e "suporta modelos locais se você editar um arquivo".

A nona é a que importa: CHIMERA_SKILL_CARDS vinha desligada, o que significa que o agente extraía uma skill de cada execução bem-sucedida e nunca lia nenhuma de volta — a afirmação central do produto com o fio cortado. Virou um interruptor, e a dica dele diz o que custa deixar desligado.

Vários projetos, e vários agentes

  • A barra lateral agrupava conversas por projeto desde sempre, mas o grupo vinha das conversas — um projeto só aparecia depois de já ter sido conversado, com o nome do último pedaço do caminho. Agora você adiciona antes de usar, e chama do que você chama.
  • Trocar de projeto mantinha a conversa (a tela dizia uma coisa e o disco dizia outra, e o disco estava certo), e uma execução congelava a digitação em todos os projetos. Os dois eram invisíveis com um workspace só.
  • Um recibo grava de qual projeto veio. Sem isso, "valeu a pena?" só podia ser global, e um veredito que funde três projetos é pior que veredito nenhum.
  • chimera agents e /api/agents/registry: id, nome, instruções, modelo, permissões. O id do agente é a lane do Kanban — o quadro já guardava a lane como texto livre e o despachante já recebia os runners injetados, então isso custou uma classe e uma linha, com o despachante intocado.
  • O quadro deixa de ser vitrine: arquivar, mover, remover e despachar, com o despacho transmitido cartão a cartão. Ele reporta quantos foram trabalhados, não quantos foram enfileirados — um cartão cuja lane não tem runner espera no backlog, e "0 trabalhados" é como você descobre que seu agente não está registrado.
  • Projetos podem ser criados e avançados pelo app, que antes conseguia aprovar um projeto sem ter como criá-lo. Um passo por clique: um projeto termina quando o SPEC dele diz que terminou.

Instalação

Os instaladores não são assinados por uma autoridade — Windows e macOS avisam na primeira execução.

Nada medido mudou: 37/37 provado (GA), ganho interno de 48% → 71% com n=100, significativo.

Read the release on GitHub