0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 7%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
20.4 / 30
03Economics
15.1 / 20
04Discoverability
11.0 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
31 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
create_project |
name_restates_behavior no_return_description |
Cria um novo projeto vazio no painel Easypanel, que servirá de agrupador para os serviços criados nele depois. O nome deve conter apenas letras minúsculas, números, hífens e underscores (regra do parâmetro projectName). Retorna o resultado da operação, confirmando o projeto criado ou reportando erro. |
delete_project |
no_return_description |
⚠️ DESTRUTIVO — Remove permanentemente o projeto e TODOS os seus serviços e dados. Irreversível. Requer confirm: "CONFIRMO". Retorna o resultado da operação, confirmando a remoção ou reportando erro. |
create_service |
no_return_description |
Cria um novo serviço de app dentro de um projeto existente. Após criar, configure a source com set_source_github ou set_source_image para poder fazer deploy. Retorna o resultado da operação, confirmando o serviço criado ou reportando erro. |
rename_service |
no_return_description |
⚠️ Renomeia ou move um serviço (inclusive para outro projeto). Webhooks, DNS e referências internas que usam o nome antigo deixarão de funcionar. Requer confirm: "CONFIRMO". Retorna o resultado da operação, confirmando a renomeação/movimentação ou reportando erro. |
destroy_service |
no_return_description |
⚠️ DESTRUTIVO — Remove permanentemente o serviço e seus dados. Irreversível. Requer confirm: "CONFIRMO". Retorna o resultado da operação, confirmando a remoção ou reportando erro. |
deploy_service |
no_return_description |
Dispara o deploy do serviço com a configuração atual. Usa o source configurado (GitHub, image, dockerfile). Funciona para serviços app E compose — detecta o tipo e roteia para o namespace certo (não precisa saber de antemão se é compose). Retorna o resultado do disparo do deploy (sucesso ou erro). |
start_service |
no_return_description |
Inicia um serviço que está parado. Funciona para app e compose (em compose, equivale a um redeploy/compose up). Retorna o resultado da inicialização (sucesso ou erro). |
stop_service |
no_return_description |
⚠️ PARA o serviço em produção. Usuários não conseguirão acessar enquanto parado. Requer confirm: "CONFIRMO". Retorna o resultado da parada (sucesso ou erro). |
restart_service |
no_return_description |
Reinicia o serviço. Causa breve indisponibilidade. Funciona para app E compose — em compose, reinicia via redeploy (docker compose up recria os containers). Retorna o resultado do reinício (sucesso ou erro). |
set_service_notes |
no_return_description |
Salva notas/anotações no serviço (markdown suportado). Retorna o resultado do salvamento, confirmando a gravação ou reportando erro. |
set_service_resources |
no_return_description |
Define limites e reservas de CPU e memória do serviço. Envie só os campos que quer alterar — os omitidos mantêm o valor atual (0 = sem limite). Memória em MB, CPU em núcleos (0.5 = meio núcleo). Aplica no próximo deploy/restart. Retorna o resultado da aplicação das alterações (sucesso ou erro). |
set_source_github |
no_return_description |
Configura a source do serviço para um repositório GitHub. O repo deve estar conectado no Easypanel (Settings > GitHub); essa source passa a ser usada nos próximos deploys. Retorna o resultado da configuração (sucesso ou erro). |
set_source_image |
name_restates_behavior no_return_description |
Configura a source do serviço para uma imagem Docker, que passa a ser usada no próximo deploy. Para imagens privadas, informe também username e password do registry; para públicas, basta a image. Retorna o resultado da configuração (sucesso ou erro). |
enable_github_deploy |
no_return_description |
Ativa o auto-deploy via GitHub: a cada push no branch configurado, um deploy é disparado automaticamente. Retorna o resultado da ativação (sucesso ou erro). |
disable_github_deploy |
no_return_description |
Desativa o auto-deploy via GitHub. Deploys precisarão ser disparados manualmente. Retorna o resultado da desativação (sucesso ou erro). |
set_env_var |
no_return_description |
Adiciona ou atualiza UMA variável de ambiente. Lê o estado atual antes de escrever — não apaga outras variáveis. Retorna o resultado da gravação da variável, confirmando o valor salvo ou reportando erro. |
delete_env_var |
no_return_description |
⚠️ Remove a variável de ambiente `key` do serviço. Lê o estado atual das variáveis antes de escrever e confirma a remoção via `confirm: "CONFIRMO"`. Retorna a confirmação da remoção e o estado atualizado das variáveis de ambiente do serviço. |
add_domain |
no_return_description |
Adiciona um domínio customizado ao serviço, mapeando `host` para a porta interna `port` com caminho base `path` (default: /). Cria automaticamente o certificado HTTPS via Let's Encrypt quando `https` é true (default). Retorna o domínio recém-criado com sua configuração (host, porta, HTTPS, path). |
remove_domain |
no_return_description |
⚠️ Remove permanentemente o domínio identificado por `domainId` (obtido via list_domains) do serviço. Após a remoção, o tráfego para esse host deixa de funcionar. Exige `confirm: "CONFIRMO"`. Retorna a confirmação de que o domínio foi removido. |
set_primary_domain |
no_return_description |
Define o domínio identificado por `domainId` (obtido via list_domains) como primário do serviço, passando a ser usado como URL principal. Retorna a confirmação de que o domínio primário foi atualizado. |
create_database |
no_return_description |
Cria um serviço de banco de dados do tipo selecionado (`postgres`, `mysql`, `mariadb`, `mongo` ou `redis`) em um projeto. Se `password` não for informada, uma senha é gerada automaticamente. Após criar, use inspect_database para obter credenciais, porta exposta, connection string e status. Retorna os detalhes de acesso do banco criado (incluindo a senha gerada, quando aplicável, e a connection string). |
destroy_database |
no_return_description |
⚠️ DESTRUTIVO — Remove permanentemente o serviço de banco de dados (`postgres`, `mysql`, `mariadb`, `mongo` ou `redis`) e TODOS os seus dados. A ação é irreversível e exige `confirm: "CONFIRMO"`. Retorna a confirmação de que o banco foi destruído. |
prune_docker |
no_return_description |
Executa um "docker system prune" no servidor inteiro via Easypanel: remove containers parados, redes sem uso, cache de build e imagens não referenciadas para liberar espaço em disco. ⚠️ Ação destrutiva e de escopo GLOBAL (afeta todos os projetos do servidor, não um serviço específico) — exige `confirm: "CONFIRMO"`. Use cleanup_docker_images para uma limpeza mais leve (só imagens não usadas). Retorna o resumo do que foi removido e o espaço em disco liberado. |
cleanup_docker_images |
no_return_description |
Remove do servidor apenas as imagens Docker não utilizadas (dangling/sem container), liberando espaço sem mexer em containers, redes ou volumes. Operação mais leve e segura que prune_docker — imagens podem ser recriadas em um novo deploy. Escopo global do servidor. Retorna a quantidade de imagens removidas e o espaço em disco liberado. |
create_mount |
no_return_description |
Adiciona um volume/mount a um serviço para persistir dados entre deploys. Use type `volume` para volume nomeado gerenciado pelo Docker (com `name`) ou `bind` para mapear um caminho do host (`hostPath`); `mountPath` é o caminho dentro do container. A configuração é aplicada no próximo deploy. ⚠️ Bind mounts de caminhos sensíveis do host exigem `confirm: "CONFIRMO"`. Retorna o mount criado; use list_mounts para ver os mounts existentes do serviço. |
create_port |
no_return_description |
Publica uma porta de um serviço no host (port mapping), expondo-a externamente sem passar pelo proxy/domínio. Mapeia `publishedPort` (porta externa no host) → `targetPort` (porta interna no container) usando `protocol` (default: tcp). Útil para TCP/UDP brutos (bancos, jogos, etc.). Aplica no próximo deploy. ⚠️ Portas privilegiadas (`publishedPort` < 1024, ex: 80/443/22) exigem `confirm: "CONFIRMO"`. Retorna o mapeamento de porta criado; consulte list_ports para a configuração completa. |
create_compose |
no_return_description |
Cria um serviço do tipo Docker Compose em um projeto. Depois use set_compose_file (via trpc_raw) ou o painel para definir o docker-compose, e deploy_compose para subir. Retorna o serviço compose criado, pronto para receber a definição do arquivo compose. |
deploy_compose |
name_restates_behavior no_return_description |
Aplica a configuração atual do serviço Compose executando 'docker compose up' no projeto especificado (projectName, serviceName). Use para aplicar alterações de compose ao serviço já existente sem recriar manualmente o container. Retorna o status/resultado do deploy disparado no serviço. |
restart_panel |
no_return_description |
⚠️ Reinicia o próprio Easypanel. O painel/API ficam brevemente indisponíveis; os serviços hospedados continuam rodando. Requer confirm: "CONFIRMO". Retorna a confirmação de que o reinício foi iniciado. |
reboot_server |
no_return_description |
⚠️ CRÍTICO — Reinicia o SERVIDOR inteiro (máquina host). TODOS os serviços e o painel ficam fora do ar até o boot completar. Use apenas em manutenção planejada. Requer confirm: "CONFIRMO". Retorna a confirmação de que o comando de reboot foi enviado ao servidor. |
trpc_raw |
no_return_description |
Chama diretamente qualquer procedure tRPC do Easypanel (~347 em 43 namespaces) não coberta pelas tools dedicadas. Use para recursos avançados: traefik.*, branding.*, cloudflareTunnel.*, box.*, mariadb.*, volumeBackups.*, databaseBackups.*, etc. Leitura (isMutation=false) é o padrão. ⚠️ Reads podem retornar dados sensíveis (env vars/secrets de qualquer projeto). Para escrita, passe isMutation:true E confirm:"CONFIRMO" — mutations arbitrárias pulam as proteções das tools curadas. Retorna o resultado da procedure chamada, ou seja, os dados devolvidos pela leitura ou a resposta/confirmação da mutation executada. |
Selection evidence
Confusable tool pairs.
7 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_exposed_ports |
list_ports |
high | Both return a service's published host ports; list_ports explicitly says it 'complements' get_exposed_ports with the full mapping. A task like 'quais portas estão expostas no meu serviço?' maps plausibly to either tool. |
get_service_logs |
get_build_logs |
medium | Both are log retrieval tools. A generic request for 'os logs do serviço' or debugging a failed deploy is ambiguous: get_build_logs returns the last build/deploy logs while get_service_logs returns container runtime logs, and neither description fully disambiguates a vague 'por que o deploy falhou?' task. |
deploy_service |
deploy_compose |
medium | deploy_service openly states it auto-detects whether the service is compose and routes correctly, so a task like 'fazer deploy/subir o serviço' could wrongly trigger deploy_compose for a generic service, or an agent could pick deploy_service when the user explicitly mentions 'subir o compose'. |
get_docker_stats |
get_service_stats |
medium | Both return per-container CPU/memory metrics. A question like 'qual o uso de CPU/memória do meu serviço X?' could wrongly select get_docker_stats (whole-server, no project/service filter) instead of the service-specific get_service_stats, since descriptions overlap heavily. |
get_system_stats |
get_docker_stats |
medium | Both report CPU, memory and network usage. A task like 'como estão os recursos/carga do servidor?' could pick the per-container docker stats instead of the server-level system stats, because both descriptions list the same metric types and neither takes parameters. |
get_service_error |
get_service_logs |
medium | Both are debugging aids for a failing service. A task like 'por que meu serviço está com erro/caindo?' could be answered by either the last registered error or the runtime logs, so the agent may pick the wrong member depending on phrasing. |
destroy_service |
destroy_database |
medium | create_database itself calls a database a 'serviço de banco de dados', so a task like 'apagar/destruir o serviço de banco' could route to the generic destroy_service instead of destroy_database; both are destructive, marked DESTRUTIVO and require CONFIRMO, increasing the chance of mistaking them. |
Compare the field