↩ Comparativo · Benchmark — avaliações
HARNESS_EVAL — Kimi Code (Moonshot AI)
Rodada ext-2 (2026-08-02) — segunda promoção Radar→corpus (spec 073). Leitura sistemática de código no fork congelado.
Metadados
- Repositório / versão ou commit avaliado: github.com/MoonshotAI/kimi-code · fork
GHDaru/kimi-code, commite22479a(2026-08-01) · CLI versão0.31.1 - Linguagem / stack: TypeScript (Node ≥24.15, pnpm 10.33), monorepo com 16 packages + 5 apps (~811k linhas de TS incluindo testes); Vitest (1.137 arquivos de teste), oxlint, Nix flake, distribuição single-binary (Node SEA); TUI sobre fork vendorizado do
pi-tui(agradecimento explícito noREADME.md) - Licença: MIT
- Data da avaliação: 2026-08-02 (lançado ~junho/2026; sucessor do kimi-cli, com migrador dedicado em
packages/migration-legacy/) - Posicionamento declarado: "AI coding agent that runs in your terminal… works out of the box with Moonshot AI's Kimi models and can also be configured to use other compatible providers" (
README.md) - Arquétipo observado: segundo vendor de modelo verticalizando no harness do corpus (depois do Grok Build/xAI), mas com aposta diferente: em vez de plataforma máxima em Rust, um produto TypeScript multi-superfície (TUI/web/IDE/ACP/SDK) cujo diferencial é autonomia estruturada (goal mode com máquina de estados e budgets, swarm de até 128 subagentes, cron exposto ao modelo) e co-design harness↔API do modelo próprio.
Dimensões
1. Loop do agente — Nota: 3
packages/agent-core/src/loop/ (2.800 linhas medidas) é um loop stateless com contratos escritos — o loop/README.md documenta owners internos, invariantes de eventos ("every dispatched tool.call must be followed by a matching tool.result") e os testes que guardam cada um. run-turn.ts impõe maxSteps; retry.ts faz 10 tentativas com backoff 0,5s→32s, jitter 25% e Retry-After do servidor sobrepondo o cálculo local; tool-scheduler.ts paraleliza tool calls por conflito de recursos declarados (ToolAccesses.conflict), não por flag booleana de read-only. A joia é agent/turn/tool-dedup.ts: dedup no mesmo step (chamada idêntica reusa o resultado da original em vez de executar duas vezes) + detecção de loop entre steps com escalada — nudge r1 na 3ª repetição, menu de decisão forçada na 5ª, hand-off na 8ª, stopTurn na 12ª — preservando o isError original. Steering mid-turn existe (turn.steer, usado também pelo cron). Turno não é retomável pós-crash, mas o wire.jsonl tolera linha final rasgada (services/message/transcript.ts).
2. Entrega de contexto — Nota: 3
profile/default/system.md (159 linhas) é um template com variáveis de OS/shell/data/tree do cwd e blocos condicionais (skills, plugin sections, notas de Windows). Descoberta de AGENTS.md em quatro raízes (~/.kimi-code, ~/.agents, raiz do projeto, .kimi-code/AGENTS.md — profile/context.ts) com orçamento soft de 32KB que avisa em vez de truncar (racional documentado no código: ~1,5–3% de uma janela de 262k). Dois requintes raros: (a) defesa de injection explícita no próprio prompt — o AGENTS.md é declarado "reference data, not a privileged instruction channel" com ordem de precedência escrita; (b) o prompt ensina o modelo a viver com a compactação (seção "Context Management" descreve exatamente o formato do sumário que ele verá). Injeções dinâmicas (plan/goal/todo/permission-mode/tools-diff em agent/injection/) acontecem só em fronteiras de turno com dedup e refresh periódico — cache-friendly por design, e o AGENTS.md do repo exige que sessionId possa mapear para prompt_cache_key do provedor. Só lê AGENTS.md (nada de CLAUDE.md/.cursor em runtime) — a compat com vizinhos é conversão assistida e revisada, via skill /import-from-cc-codex, não leitura silenciosa. A variação por modelo fica na camada de capability (kosong/providers/capability-registry.ts), não no texto do prompt.
3. Compactação — Nota: 3
agent/compaction/: gatilho a 85% da janela com reservedContextSize de 50k, caminho reativo de overflow com classificação do erro e até 3 re-tentativas encadeadas (maxOverflowCompactionAttempts), 5 tentativas para o próprio sumário com detecção de resposta truncada (CompactionTruncatedError). A abordagem é distinta de todo o resto do corpus: em vez de sumário estruturado de seções fixas, um handoff note em primeira pessoa (compaction-instruction.md, 78 linhas — "escreva como seu próprio fluxo de pensamento em continuação, na língua da conversa") mais as mensagens do usuário mantidas verbatim sob orçamento de 20k tokens com esquema head+tail (2k para as mais antigas — o enunciado original — e o resto para as recentes) e marcador de elisão que nunca se acumula entre compactações (handoff.ts). Todo list sobrevive à compactação; /compact aceita instrução custom. Micro-compaction (limpeza de tool results antigos) existe mas está desligada (micro.ts: "Micro compaction is disabled") — honestidade no código, meio caminho perdido.
4. Design de ferramentas — Nota: 3
27 exports em tools/builtin/index.ts, 26 no perfil default (profile/default/agent.yaml), em 8 categorias: arquivo (6, incluindo ReadMediaFile com vídeo — capability video_in real no kosong), shell (1), web (2), colaboração (Agent/AgentSwarm/AskUserQuestion/Skill), planejamento (2), goal (4), estado (TodoList), background (3) e cron (3). Cada tool tem um .md de prompt pareado e templatado (o bash.md interpola os próprios timeouts — descrição e implementação não dessincronizam). Schemas Zod com refinements; read-only explícito como allowlist de 19 tools em default-tool-approve.ts, com comentários justificando cada inclusão. Dois detalhes de produção: bash foreground que estoura timeout migra para background em vez de ser morto, e select_tools implementa progressive disclosure de schemas — definições dinâmicas ficam fora do tools[] imutável e são carregadas por nome via o wire contract messages[].tools, gated pela capability dynamically_loaded_tools do modelo (co-design com a API Kimi; degradação "byte-for-byte" documentada em agent/index.ts:270).
5. MCP — Nota: 2
Cliente com 3.180 linhas (src/mcp/): stdio, HTTP streamable e SSE; OAuth completo com DCR, PKCE e persistência de discovery state (mcp/oauth/provider.ts); reconexão gerenciada (connection-manager.ts, 599 linhas); truncamento de output em 100k chars e cap de 10MB por parte binária (output.ts); compat com .mcp.json de raiz de projeto — com o aviso honesto de que habilitar isso em checkout não confiável "executa o que o mcp.json declarar" (config-loader.ts:48). O distintivo é o /mcp-config: configuração e login OAuth de servidores MCP conversacional, como skill built-in (skill/builtin/mcp-config.ts) — o agente edita a config por você. Falta a outra metade do protocolo: sem resources, prompts ou roots, sem modo servidor.
6. Permissões e sandboxing — Nota: 2
agent/permission/policies/index.ts: pipeline de 19 policies ordenadas onde o primeiro resultado não-undefined vence, com o racional de cada posição comentado. A ordem embute decisões corretas: deny rules do usuário e o hook PreToolUse vêm antes do approve de auto mode; e o ask de arquivo sensível (.env, chaves SSH, credenciais) e de paths de controle do git vem antes do approve do yolo — yolo ainda pergunta para tocar segredo. Regras DSL Tool(argPattern) com glob (matches-rule.ts), aprovação com escopo de sessão memorizada, GitCwdWriteApprove (edições dentro de cwd num work tree git aprovam sozinhas — o git é o undo). As lacunas: no engine v1 que está em produção, o matching de Bash é glob sobre a string do comando inteiro (bash.ts:267) — o parser bash puro-TS com orçamento determinístico (packages/tree-sitter-bash, 4.790 linhas) só é consumido pelo engine v2 experimental (agent-core-v2/src/app/bashParser/); zero sandbox de SO (nenhum Landlock/Seatbelt/bwrap no tree — o system prompt admite: "The operating environment is not in a sandbox"); trust de workspace só existe no v2/kap-server (workspaceTrust). A política é sofisticada; o enforcement é 100% in-process.
7. Memória e estado — Nota: 2
Sessões como records append-only em wire.jsonl (agent/records/persistence.ts) com blob store para mídia (blobref.ts com dedup por EEXIST), migração de formato (records/migration/), tolerância a crash mid-flush. /sessions com resume e busca, /fork (que não herda o goal da origem — FORKED_SESSION_DROPPED_FILES), /undo com rollback de prompts + todo list + estado de plan mode (explícito na doc: código não é revertido), /export-md e /export-debug-zip. Estado compartilhado entre TUI, VS Code e web via KIMI_CODE_HOME (a doc do VS Code avisa que lock cross-process não é garantido). Migração real do kimi-cli antigo: packages/migration-legacy/ (27 arquivos, 2.923 linhas — schema do config antigo, migração de sessões, relatório, marker de idempotência). Sem memória de longo prazo auto-gerenciada e sem checkpointing de workspace — as mesmas duas metades que faltam no Pi.
8. Planejamento — Nota: 3
Plan mode com enforcement por policy, não por prompt: plan-mode-guard-deny.ts nega Write/Edit fora do arquivo de plano (persistido por plan-id, agent/plan/index.ts), e nega TaskStop/CronCreate/CronDelete ("mutaria trabalho agendado que roda após o exit"). ExitPlanModeReviewAsk roda antes do histórico de aprovações de sessão — comentado: uma aprovação velha não pode furar a revisão de um plano novo. Reminders com variantes full/sparse/reentry dedupadas por turno (injection/plan-mode.ts). E acima do plan mode, o goal mode (agent/goal/index.ts, 776 linhas; spec de 232 linhas em GOAL.md na raiz): goal como estado estruturado do runtime com máquina active/paused/blocked/complete, driver de continuação por turno, budgets de turns/tokens/wall-clock com hard-stop e guidance de convergência a 75%, erro técnico vira paused (recuperável) e bloqueio de negócio vira blocked, resume de sessão rebaixa active→paused para não queimar recursos sozinho após restart, fila de goals futuros (/goal next) e modo headless com exit codes por estado final (cli/goal-prompt.ts). Fuga conhecida: o guard não inspeciona redirects do Bash — mitigado só por prompt.
9. Subagentes / orquestração — Nota: 3
Agent + AgentSwarm (tools/builtin/collaboration/): subagentes same-process com contexto e wire.jsonl próprios, timeout de 30 min com resume por id (inclusive de agentes que estouraram o timeout), perfis YAML built-in (agent/coder/explore/plan — só o coder edita arquivos) + custom por arquivo com 5 níveis de prioridade (plugin/user/extra/project/explicit) e grafo de delegação com allowlist por perfil (profile/agentfile/catalog.ts). O swarm aceita até 128 subagentes por template {{item}} com validações enforçadas antes do launch (mínimo 2 itens, prompts expandidos distintos, batch-exclusividade garantida por policy de permissão — agent-swarm-exclusive-deny.ts). Permissões derivam por parenting do PermissionManager (options.parent); /btw abre um side-agent forkado da conversa com deny-all de tools empilhado (subagent-host.ts:287). A lacuna real: zero isolamento de filesystem — 128 coders compartilham o mesmo diretório, e a única mitigação é o prompt do swarm pedindo escopos não conflitantes (agent/swarm/enter-reminder.md). Comparado ao worktree CoW do Grok Build, é a metade do problema resolvida.
10. Verificação / evals — Nota: 2
1.137 arquivos .test.ts medidos, com um harness de agente de verdade: test/agent/harness/ roda o Agent real contra um LLM roteirizado (scripted-generate.ts) e snapshota eventos, RPC e wire; kosong/test/e2e/ estressa o pipeline de streaming com fake provider (abort no meio do stream, extreme streams, consistência cross-provider); o parser bash tem fixtures diferenciais contra o tree-sitter wasm de referência (README do package); guard tests de disciplina (no-date-now.test.ts no cron). CI multi-workflow + build Nix com verificação de sincronização de workspace. Mas: zero evals comportamentais no tree — nenhum juiz LLM, nenhuma suíte de tarefas, nenhum baseline de competência para um sistema cheio de heurísticas calibradas (nudge na 3ª repetição, stop na 12ª, budget de goal a 75%). O AGENTS.md da raiz referencia um packages/server-e2e de testes live que não existe no export público — mesma ressalva de auditabilidade do Grok Build. Sem LSP/lint pós-edição.
11. Extensibilidade — Nota: 3
16 eventos de hook (session/hooks/types.ts: do PreToolUse a PreCompact/PostCompact, PermissionRequest/Result, SubagentStart/Stop) com semântica de block, matchers, timeout/cwd/env por hook; UserPromptSubmit pode bloquear ou injetar contexto. Plugins com marketplace por manifesto (plugins/marketplace.json com tiers official/curated e trust exibido na instalação), instaláveis de qualquer repo GitHub, contribuindo skills, agentes, MCP e seções de prompt. Skills em SKILL.md compatíveis com a convenção .agents/skills (compartilhável entre ferramentas), com bundles hierárquicos de sub-skills e curadoria assistida (/sub-skill.review + /sub-skill.consolidate com backups timestamped). Provedores: Kimi, Anthropic (com breakpoints cache_control e matriz de thinking-effort por família — anthropic-profile.ts), OpenAI chat completions e Responses, Google GenAI, tudo mediado por capability registry; /secondary_model dedica um modelo mais barato aos subagentes. O detalhe meta: o próprio repo é "built for agent-assisted development" — AGENTS.md raiz de densidade extrema e 8 skills de desenvolvimento em .agents/skills/ (write-tui, agent-core-dev, gen-docs…); o produto é dogfooded como plataforma de extensão.
12. Interfaces — Nota: 3 ⭐
A superfície mais ampla do corpus, e todas first-party no mesmo tree: TUI (sobre pi-tui vendorizado, 12.477 linhas); headless -p com text/stream-json e goal headless com exit codes por estado final; ACP como cidadão de primeira classe (kimi acp, packages/acp-adapter com 5.534 linhas + 36 arquivos de teste — Zed/JetBrains); extensão VS Code nativa (apps/vscode, via node-sdk, compartilhando config/sessões com o CLI); web UI peer do TUI (apps/kimi-web, Vue, sobre kap-server REST+WS com protocolo de transcript sequenciado por op-batch e catch-up por cursor — packages/transcript é um pacote isomórfico dedicado só ao contrato de renderização); SDK público (packages/node-sdk); e apps/kimi-inspect, um inspetor de debug que reflete todo o registro de serviços DI do servidor. O /web faz handoff da sessão do terminal para o browser. Sem A2A.
Dimensões suplementares (não entram no total 0–36)
13. Aprendizado / auto-melhoria — Nota: 1
Sem captura autônoma de skills a partir da experiência. O que existe: o system prompt instrui manter os AGENTS.md atualizados após mudanças que os desatualizem (auto-manutenção da memória de projeto por instrução), /init gera o AGENTS.md inicial, e a dupla /sub-skill.review→/sub-skill.consolidate é ferramenta de curadoria do inventário de skills (proposta read-only, aplicação com backup) — mas o gatilho é sempre humano.
14. Proatividade / agendamento — Nota: 2
Cron de verdade exposto ao modelo: CronCreate/List/Delete com expressão 5-field em timezone local, recorrente ou one-shot, persistido por sessão (<sessionDir>/cron/<id>.json) e reidratado no resume; fires entram como steer quando o turno está idle (agent/cron/manager.ts gateia em hasActiveTurn), com coalescing de disparos perdidos (coalescedCount no envelope XML — "trate >1 como 'perdi checagens, só o estado atual importa'") e flag stale após 7 dias. Background tasks notificam conclusão automaticamente. O goal driver soma autonomia multi-turno com budget. Limite estrutural: o scheduler vive no processo — sem daemon, sem webhooks, sem wake externo; fechou o terminal, morreu a proatividade.
Síntese
Tabela de notas
| # | Dimensão | Nota |
|---|---|---|
| 1 | Loop do agente | 3 |
| 2 | Entrega de contexto | 3 |
| 3 | Compactação | 3 |
| 4 | Ferramentas | 3 |
| 5 | MCP | 2 |
| 6 | Permissões/sandbox | 2 |
| 7 | Memória/estado | 2 |
| 8 | Planejamento | 3 |
| 9 | Subagentes | 3 |
| 10 | Verificação/evals | 2 |
| 11 | Extensibilidade | 3 |
| 12 | Interfaces | 3⭐ |
| Total (0–36) | 32 |
Leitura
- Perfil/arquétipo: o segundo vendor de modelo do corpus a verticalizar no harness confirma a tese da convergência por outro caminho que o Grok Build: onde o xAI construiu profundidade industrial em Rust (35 pontos, sandbox kernel-enforced, worktrees CoW), a Moonshot construiu largura de produto em TypeScript (32 pontos, cinco superfícies, autonomia estruturada) — e ambos leem/importam os artefatos dos vizinhos. A relação com o modelo próprio é engenheirada, não hardcoded: o prompt default é agnóstico; a especialização Kimi vive na camada de capability (
dynamically_loaded_tools,prompt_cache_key, vídeo), e cada gate fechado "reproduz o comportamento inline byte-for-byte" — outros provedores perdem features, nunca correção. - 3 pontos mais fortes: o pacote de autonomia controlada — goal mode como estado de runtime com budgets, hard-stops, rebaixamento active→paused no resume e confirmação de permissão quando o modelo propõe o goal (
GOAL.md+agent/goal/+goal-start-review-ask.ts); compactação por handoff em primeira pessoa com mensagens do usuário verbatim em head+tail (compaction/handoff.ts— o enunciado original nunca é confiado ao sumarizador); a pipeline de 19 policies de permissão com ordenação comentada onde arquivo sensível pergunta até em yolo (permission/policies/index.ts). - 2 pontos mais fracos: enforcement sem chão — zero sandbox de SO, bash autorizado por glob de string no engine em produção (o parser AST pronto em
packages/tree-sitter-bashsó serve o v2 experimental), e swarm de até 128 escritores sem isolamento de filesystem; e a dualidade de engines —agent-core(68k linhas) eagent-core-v2(94k linhas) reimplementam a mesma semântica com ordem explícita de mantê-las em sincronia à mão (profile/agentfile/catalog.ts: "keep merge/override/delegation behavior in sync across both engines") — um custo de coerência que o repo paga a cada feature. - Recurso distintivo: progressive tool disclosure ancorada em capability do modelo —
select_toolsmantém schemas dinâmicos fora dotools[]imutável e os injeta como mensagemrole: systemvia o wire contractmessages[].toolsda API Kimi, com anúncios<tools_added>/<tools_removed>e serialização deliberada contra double-inject (tools/builtin/select-tools.ts). É o único caso no corpus em que o vendor mudou a API do modelo para servir o harness, em vez de só mudar o harness para servir o modelo. - "O que roubar": (1) o dedup de tool calls em duas camadas (~200 linhas em
tool-dedup.ts: reusar o resultado no mesmo step, escalar nudges entre steps, parar na 12ª — sem transformar sucesso em erro); (2) manter as mensagens do usuário verbatim através da compactação com orçamento head+tail e marcador de elisão que não se acumula; (3) bash com timeout que promove para background em vez de matar (o trabalho não se perde, a notificação chega sozinha); (4) o cron comcoalescedCount— a semântica "perdi N disparos, execute uma vez" evitada explicitamente no prompt da tool. - Cláusula de expiração: a escada r1/r2/r3/stop do dedup e o arsenal de reminders anti-"complete prematuro" do goal mode existem porque os modelos atuais entram em loop e declaram vitória cedo — melhora o modelo, encolhe essa camada. O
select_toolsexiste porque schema de tool custa contexto; janela barata o aposenta. A dualidade v1/v2 é transitória por definição (KIMI_CODE_EXPERIMENTAL_FLAGé o interruptor mestre) — o que vale observar é se o v2 chega com o parser AST de bash ligado ao gate de permissão, fechando a lacuna mais barata de fechar do sistema.