30.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 2%, unconfirmed writes 100%→100%.
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
28.0 / 30
03Economics
19.8 / 20
04Discoverability
12.6 / 20
Highest-impact fix
Estimated gain +7 pointsMake target tools discoverable on the first call
Clarify tool names, decision boundaries, and required argument schemas so an agent can choose and construct the target call without exploratory steps.
Description evidence
Defects and rewrites.
3 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_cities_by_country |
no_return_description |
List cities within a specific country, optionally filtered to a minimum population and sorted by population (descending) or name (ascending). Returns up to `limit` matching cities with their population and country, drawn from a global database of 13.4M cities. |
compare_countries |
no_return_description |
Compare two countries side by side across available metrics such as population, area, GDP, HDI, and life expectancy. Returns a comparison of both countries' values for each metric. |
get_rankings |
no_return_description |
Get country rankings for a selected metric slug (population, area, gdp, hdi, life-expectancy, or one of 9 Bamwor indices), or list all available metrics when `metric` is omitted. Optionally restrict to sovereign countries via `countries_only`. Returns a ranked list of countries for that metric, up to `limit` entries. |
Selection evidence
Confusable tool pairs.
3 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_city |
get_nearby_cities |
medium | Both take a city_id and return city-related data. A task like 'find cities near Tokyo and get their details' could make the agent call get_city instead of get_nearby_cities, since get_city says 'get detailed info about a specific city' and get_nearby_cities focuses on nearby listings rather than detail. |
search_cities |
list_cities_by_country |
medium | Both return lists of cities and their descriptions overlap heavily (cities, population, 13.4M+ database). A task like 'find cities in Brazil above 1M population' could lead the agent to search_cities (generic city search) instead of list_cities_by_country, which has the country+min_population filter. |
search_countries |
search_cities |
medium | Both are name-based search tools with near-identical signatures (query + limit). A task phrased as 'search for Paris' is unambiguous, but vague tasks like 'search for Kingston' or 'find data on Rome' give no entity signal, so the agent could pick the wrong search tool and return the wrong entity type. |
Compare the field