0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 4%, 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
25.3 / 30
03Economics
19.7 / 20
04Discoverability
15.2 / 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 |
|---|---|---|
deployments_list |
name_restates_behavior |
List all deployments you have created, including each deployment's live URL, status, labels, and password protection state, so you can find a deployment's hostname or check its current state. |
deployments_get |
name_restates_behavior |
Fetch full details for a single deployment by hostname, including its live URL, status, file count, size, labels, and password protection state, so you can inspect a specific deployment after listing your deployments. |
deployments_set |
no_return_description |
Update the labels of a deployment by hostname, replacing all existing labels with the labels you provide (pass an empty array to clear all labels). Returns confirmation that the labels were updated. |
deployments_remove |
no_return_description |
Permanently delete a deployment and its files by hostname. You MUST confirm with the user before calling this tool, referencing the deployment. Returns confirmation that the deployment was deleted. |
domains_set |
no_return_description |
Create or update a custom domain. Can reserve a name (omit deployment), link it to a deployment, switch deployments, or update labels. After creating, call domains_records and show the DNS records to the user. Returns the created or updated domain details. |
domains_list |
name_restates_behavior |
List all custom domains you have created, including each domain's URL, linked deployment, and verification status, so you can find a domain's name or see how it is currently set up. |
domains_get |
name_restates_behavior |
Fetch full details for a single custom domain by name, including its URL, linked deployment, verification status, and labels, so you can inspect a specific domain after listing your domains. |
domains_dns |
no_return_description |
Look up the DNS provider for a domain (e.g. Cloudflare, Namecheap) so the user knows where to configure their DNS records. Returns the name of the DNS provider for the given domain. |
domains_verify |
no_return_description |
Trigger DNS verification for a custom domain. Call after the user has configured the DNS records from domains_records. Returns the current verification status; verification is asynchronous, so the domain status updates once DNS propagates. |
domains_remove |
no_return_description |
Permanently delete a custom domain by name. You MUST confirm with the user before calling this tool, referencing the domain name. Returns confirmation that the domain was deleted. |
Selection evidence
Confusable tool pairs.
10 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
deployments_list |
domains_list |
medium | Both return a list of URLs with status for resources users often call 'sites'; a task like 'show me all my URLs and their status' doesn't reveal whether deployments or domains is meant. |
deployments_get |
domains_get |
medium | Both accept a hostname-like identifier and return URL, status, and labels. A task such as 'get the status and labels for my site' could lead the agent to the wrong resource, since users rarely say 'deployment' vs 'domain'. |
domains_list |
domains_get |
medium | Both report a domain's linked deployment and verification status; a task like 'what's the verification state of my domains' is ambiguous between scanning all (list) and inspecting one (get). |
deployments_list |
deployments_get |
medium | Both descriptions share URL, status, labels, and password-protection fields; a task like 'check the password protection or labels on my deployment' doesn't specify whether all deployments or a specific one is wanted. |
deployments_remove |
domains_remove |
medium | Both permanently delete with confirmation, and a user saying 'take down/delete my site' could mean the deployment or the custom domain pointing at it; both match the delete wording. |
deployments_set |
domains_set |
medium | Both accept labels and describe themselves as updates; a task like 'update the labels on my production resource' gives no clue whether the labels belong to a deployment or a domain. |
domains_records |
domains_share |
medium | domains_share is described as returning the required DNS records (as a shareable hash), so a task like 'get the DNS records I need to configure' could plausibly select either tool. |
domains_dns |
domains_verify |
low | A task like 'check the DNS for my domain' is ambiguous between looking up the DNS provider (dns) and triggering DNS verification (verify). |
domains_dns |
domains_share |
low | A vague request like 'help me with DNS setup for my domain' could match either the provider lookup or the shareable DNS hash tool. |
domains_get |
domains_records |
low | A task like 'show me domain info for example.com' could select get (details) when the user actually wants the DNS records to configure; both mention the domain and 'get'. |
Compare the field