30.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 6%, 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
27.7 / 30
03Economics
20.0 / 20
04Discoverability
14.7 / 20
Highest-impact fix
Estimated gain +5 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.
5 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 |
|---|---|---|
get_team_schedule |
params_unexplained |
Get a team's past and upcoming fixtures by team slug (e.g. 'barcelona', 'manchester-united', 'los-angeles-lakers'). `limit` caps how many fixtures are returned (default 10, up to 30). |
get_standings |
name_restates_behavior |
Get the current standings table for a league or competition by slug (e.g. 'premier-league', 'la-liga', 'nba'). Returns the full ranking of every team in the competition with their current positions, for questions like which team is top of the league. |
get_top_scorers |
params_unexplained |
Get the top scorers (or top assisters) for a competition. Useful for 'who's leading the Premier League scoring charts?'. `limit` caps the number of players returned (default 20, up to 50). |
get_player |
name_restates_behavior |
Get player statistics and metadata for a single athlete by player slug (e.g. 'lionel-messi', 'lebron-james', 'virat-kohli'). Use this when a match, schedule or standings result references a player and you need that player's own stats. |
get_bracket |
name_restates_behavior |
Get the knockout bracket for a tournament by slug (e.g. 'uefa-champions-league', 'nba-playoffs'). Use when you need the full tournament bracket showing which teams face off in each knockout round, rather than a single match. |
Selection evidence
Confusable tool pairs.
4 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_matches |
get_tracker |
medium | Both describe live match data (shared token 'live'). A task like 'track the live match' or 'give me live match updates/position' could route to get_matches, which lists live matches with scores/status, instead of get_tracker's position/animation data, especially since the tracker's numeric id must be sourced from get_matches results. |
get_standings |
get_bracket |
medium | Both report a competition's current state. A task like 'who's still in the Champions League' or 'show me the tournament standings' is genuinely ambiguous between a league table (get_standings) and a knockout bracket (get_bracket), as either plausibly answer ranking/advancement questions. |
get_match_detail |
get_team_schedule |
medium | Both accept a slug and are team/match focused. A task like 'get Barcelona's upcoming game details' or 'show me the manchester-united vs liverpool fixture' is ambiguous between the single-match tool (needs a match slug) and the team schedule tool (needs a team slug), and neither description disambiguates which slug format the user supplies. |
get_matches |
get_standings |
medium | A task like 'what's the current state/status of the Premier League right now' can be answered by either live/recent match scores (get_matches) or the league table (get_standings). Without explicit words like 'scores' or 'table', an agent using only the descriptions could plausibly pick the wrong member. |
Compare the field