0.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 15%, 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
22.2 / 30
03Economics
19.7 / 20
04Discoverability
11.1 / 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.
13 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 |
|---|---|---|
cf_zones |
params_unexplained no_return_description |
Lists Cloudflare zones (domains) in the account. 'page' selects the results page and 'perPage' sets how many zones to return per page (max 50); returns an array of zone objects with id, name, and status. |
cf_dns_list |
params_unexplained no_return_description |
Lists DNS records belonging to the zone given by 'zoneId'. 'page' and 'perPage' (max 100) control pagination; returns an array of DNS record objects (id, type, name, content, ttl, proxied). |
cf_dns_create |
params_unexplained no_return_description |
Creates a DNS record in the zone given by 'zoneId', using the supplied type, name, content, ttl, and proxied flag; returns the newly created DNS record object including its assigned ID. |
cf_dns_delete |
params_unexplained no_return_description |
Deletes the DNS record 'recordId' from the zone given by 'zoneId'; returns confirmation that the record was deleted. |
cf_workers_list |
no_return_description |
Lists Workers scripts deployed under the given (or default) account; returns an array of script metadata objects including name and last-modified date. |
cf_worker_delete |
params_unexplained no_return_description |
Deletes the Workers script 'scriptName' from the account given by 'accountId' (falls back to the configured default account); returns confirmation that the script was deleted. |
cf_kv_namespaces |
params_unexplained no_return_description |
Lists KV namespaces under the account given by 'accountId' (falls back to the configured default account); returns an array of namespace objects including id and title. |
cf_kv_keys |
params_unexplained no_return_description |
Lists keys in the KV namespace 'namespaceId', optionally filtered by 'prefix' and capped at 'limit' results (max 1000), under the account given by 'accountId'; returns an array of key metadata objects. |
cf_kv_get |
params_unexplained no_return_description |
Reads the value stored under 'key' in the KV namespace 'namespaceId', under the account given by 'accountId'; returns the stored value's contents. |
cf_kv_put |
params_unexplained no_return_description |
Writes 'value' under 'key' in the KV namespace 'namespaceId', under the account given by 'accountId'; returns confirmation that the write succeeded. |
cf_kv_delete |
params_unexplained no_return_description |
Deletes the entry under 'key' in the KV namespace 'namespaceId', under the account given by 'accountId'; returns confirmation that the key was deleted. |
cf_r2_buckets |
params_unexplained no_return_description |
Lists R2 storage buckets under the account given by 'accountId'; returns an array of bucket objects including name and creation date. |
cf_cache_purge |
params_unexplained no_return_description |
Purges cached content for the zone given by 'zoneId' — everything when 'purgeAll' is true, otherwise only the entries listed in 'urls'; returns confirmation that the purge request was accepted. |
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 |
|---|---|---|---|
cf_kv_get |
cf_kv_put |
medium | A vague task like 'update the KV value for key X' could lead the agent to call cf_kv_get instead of cf_kv_put, or vice versa, since both operate on the same key/namespace and differ only in read vs write intent. |
cf_dns_list |
cf_dns_create |
low | Both operate on DNS records for a zone; a task like 'add the DNS record' is unlikely to be confused with listing, but an ambiguous phrasing like 'set up the www record' could momentarily point to list if the agent is checking existence first, though intent is usually clear. |
cf_dns_delete |
cf_kv_delete |
low | Both are delete operations but act on entirely different resource types (DNS record vs KV key) with distinct required params, so confusion is unlikely unless the task is extremely vague about what 'record' means. |
cf_dns_delete |
cf_worker_delete |
low | Both delete Cloudflare resources but target clearly different entities (DNS record vs Worker script); a task naming 'the record' vs 'the worker' would disambiguate easily. |
cf_kv_namespaces |
cf_kv_keys |
medium | A task like 'list the KV namespace contents' is ambiguous between listing namespaces themselves (cf_kv_namespaces) and listing keys within a namespace (cf_kv_keys), especially if the user conflates 'namespace' with its contents. |
cf_dns_list |
cf_workers_list |
low | Both are 'list' tools but for unrelated resource types (DNS records vs Worker scripts); a task would need to omit the resource type entirely to cause confusion, which is unlikely. |
cf_workers_list |
cf_worker_delete |
low | Clearly distinct actions (list vs delete) on the same resource type; a task like 'remove the worker' would not plausibly trigger the list tool. |
Compare the field