0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 12%, 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
23.5 / 30
03Economics
20.0 / 20
04Discoverability
11.6 / 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.
10 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 |
|---|---|---|
list_containers |
no_return_description |
List Docker containers present on the host; stopped containers are included only when all=true. Returns the details of each container (ID, name, status, image, and similar). |
container_logs |
no_return_description |
Retrieve the log output of the container identified by id, reading from the last tail lines (default 100). Returns the requested log lines as text. |
start_container |
name_restates_behavior no_return_description |
Start the stopped container identified by id or name so its processes resume. Returns confirmation of the container's resulting state. |
stop_container |
name_restates_behavior no_return_description |
Stop the running container identified by id or name, halting its processes. Returns confirmation once the container is no longer running. |
restart_container |
name_restates_behavior no_return_description |
Stop and immediately start again the container identified by id or name, relaunching its processes under the current configuration. Returns confirmation of the restart. |
remove_container |
name_restates_behavior no_return_description |
Delete the container identified by id or name, including its writable filesystem. Use force=true to remove it even while running. Returns confirmation of removal. |
exec_command |
no_return_description |
Run command and its arguments inside the running container identified by id, executing within that container's environment. Returns the command's stdout, stderr, and exit status. |
container_stats |
no_return_description |
Read the current CPU, memory, and network usage of the running container identified by id. Returns the collected usage statistics for that container. |
list_images |
name_restates_behavior no_return_description |
List the images stored on the Docker host. Returns an array of images with their tags, IDs, and sizes. |
remove_image |
name_restates_behavior no_return_description |
Delete the image identified by id or tag from the host to free disk space. Use force=true to remove the image even if it is in use. Returns confirmation of removal. |
Selection evidence
Confusable tool pairs.
15 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
remove_container |
remove_image |
medium | A user saying 'remove/delete the containerized app' or 'get rid of my old container' without explicitly saying 'image' could map to either tool; both take an 'id' and both delete objects, so the agent must infer whether the target is a container or an image. |
start_container |
restart_container |
medium | A task like 'start the container back up' or 'turn the container on again' is ambiguous between starting a stopped one and restarting a running one; the verbs 'start' and 'restart' overlap heavily in casual phrasing. |
start_container |
stop_container |
medium | Users often say 'restart the container' or 'turn it off and on' fluidly; a task phrased as 'restart' or 'toggle the status' could push an agent to pick either start or stop without determinism. |
stop_container |
container_stats |
medium | A task like 'check on the running container' or 'see what the container is doing' is ambiguous between reading stats and taking a control action on a running container; both are framed around running containers. |
list_containers |
container_logs |
low | A request like 'show me what's in my containers' could plausibly mean listing containers or fetching their logs, but logs require a specific id and list is inventory-oriented, so confusion is possible but not strong. |
list_images |
remove_image |
medium | A task like 'clean up my images' or 'find the images I can remove' could lead an agent to list images for inspection when removal was intended, or to delete when the user only asked to view them. |
list_containers |
list_images |
low | A task like 'what do I have running' clearly points to containers, while 'what images exist' points to images; only a vague 'show me everything' would be ambiguous, making confusion unlikely. |
container_logs |
restart_container |
low | Fetching logs and restarting are functionally opposite (read vs. control) and typical phrasing—'see errors' vs 'fix it by restarting'—resolves the intent clearly. |
container_logs |
remove_container |
low | Log retrieval and deletion are too semantically distant in intent for a natural-language task to plausibly confuse them. |
list_containers |
remove_container |
low | 'What containers are there' (list) and 'delete this container' (remove) are clearly differentiated by the action verb in typical tasks. |
list_containers |
restart_container |
low | Listing and restarting are distinct actions; a user wanting to restart names a specific container, which an agent would not confuse with listing all of them. |
restart_container |
remove_container |
low | Restarting and removing imply very different outcomes (bring back up vs. delete); phrasing like 'cycle it' versus 'delete it' is generally unambiguous. |
container_logs |
container_stats |
low | Both are read operations, but a task for logs ('show output/errors') versus stats ('show CPU/memory') names the requested data type explicitly, so confusion is unlikely. |
start_container |
container_stats |
low | Starting is a control action while stats is read-only; requests like 'boot the container' versus 'check its resource usage' are clearly separated in intent. |
stop_container |
exec_command |
low | Stopping a container and running a command inside it are distinct operations; casual phrasing rarely conflates 'halt it' with 'run this inside it'. |
Compare the field