01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→95, token cost up 18%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
24.5 / 30
20.0 / 20
10.4 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
7 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_buckets |
name_restates_behavior no_return_description |
Return the names of every S3 bucket available in your AWS account. Use this to discover which buckets exist and to confirm the correct bucket name before listing objects or writing data. |
list_objects |
name_restates_behavior params_unexplained no_return_description |
Return up to maxKeys object keys (default 100) stored in the named S3 bucket, optionally limited to keys starting with the given prefix (e.g. 'uploads/'). Use this to discover stored files before reading or deleting them. |
get_object |
params_unexplained no_return_description |
Download the object stored at the given key in the named S3 bucket and return its contents as a text string. Use this to read file content directly as an alternative to a presigned URL. |
put_object |
params_unexplained no_return_description |
Write the provided content to the S3 object at the given key in the named S3 bucket, setting the Content-Type header to the supplied content type (default text/plain). Returns the result of the upload, such as the ETag, or an error if the write fails. |
delete_object |
name_restates_behavior params_unexplained no_return_description |
Permanently remove the S3 object stored at the given key in the named bucket and return a success confirmation, or an error if the object does not exist. Use this to clean up storage after processing. |
presigned_url |
name_restates_behavior params_unexplained no_return_description |
Return an HTTPS URL that grants temporary access to the S3 object at the given key in the named bucket, expiring after expiresIn seconds (default 3600). Use this to share private objects with others without giving them AWS credentials. |
bucket_info |
params_unexplained no_return_description |
Return whether the named S3 bucket exists and basic information about it, such as its region and creation date. Use this to verify a bucket exists before performing operations on it. |
Selection evidence
3 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
list_buckets |
list_objects |
medium | A task like 'list what I have in S3' or 'show my S3 contents' is ambiguous: list_buckets enumerates account-level buckets while list_objects enumerates keys inside a specific bucket, and both share the 'list'/'s3' tokens. |
list_buckets |
bucket_info |
medium | Tasks phrased as 'check my bucket' or 'get info on my buckets' map ambiguously: list_buckets returns all buckets with no inputs, while bucket_info checks existence/details of a single named bucket. |
list_objects |
get_object |
medium | A task like 'get/read the objects in bucket X' is ambiguous: get_object reads one object's text by key, while list_objects returns the list of keys in the bucket; the 'get' verb and shared 'object' token can mislead the agent. |
Compare the field