01Safety
0.0 / 30
What changed in the harness
Selection accuracy 96→98, token cost up 6%, 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
18.1 / 30
10.5 / 20
11.1 / 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
44 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 |
|---|---|---|
favourite_studio |
name_restates_behavior no_return_description |
Toggles favourite status for a studio identified by 'id' on the authorized user's account (favourites it if not already favourited, unfavourites it otherwise). Requires login. Returns the studio's updated favourite status. |
get_genres |
no_return_description |
Get all available genres on AniList. Returns an array of genre name strings usable in media search filters. |
get_media_tags |
no_return_description |
Get all available media tags on AniList. Returns an array of tag objects (name, category, description, adult flag) usable in media search filters. |
get_site_statistics |
no_return_description |
Get AniList site statistics over the last seven days. Returns time-series statistics such as user counts, anime/manga counts, and activity volume. |
get_studio |
params_unexplained no_return_description |
Get information about a studio by its AniList ID or name. 'studio' accepts either a numeric AniList studio ID or the studio's name as a string. Returns the studio's details, including its name and associated media. |
delete_activity |
no_return_description |
[Requires Login] Delete the current authorized user's activity post identified by 'id'. Returns confirmation of the deletion. |
get_activity |
no_return_description |
Get a specific AniList activity by its ID. Returns the activity's details, including its type, text/content, and associated user or media. |
get_user_activity |
no_return_description |
Fetch activities from a user identified by AniList 'user' ID, paginated via 'page' and 'perPage'. Returns a page of the user's activity entries. |
post_message_activity |
no_return_description |
[Requires Login] Post a new message activity to 'recipientId' with the given 'text', or update an existing one if 'id' is provided (null creates a new message); 'isPrivate' controls message visibility. Returns the created or updated message activity. |
post_text_activity |
no_return_description |
[Requires Login] Post a new text activity with the given 'text', or update an existing one if 'id' is provided (null creates a new activity). Returns the created or updated text activity. |
add_list_entry |
name_restates_behavior no_return_description |
Adds a media entry (by 'id') to the authorized user's anime or manga list, applying the fields in 'options' such as status, score, progress, and dates. Requires login. Returns the created list entry. |
get_user_anime_list |
name_restates_behavior no_return_description |
Fetches all anime entries on the specified user's list, identified by username or numeric user ID via 'user'. Returns the list entries grouped by status, including scores and progress. |
get_user_manga_list |
name_restates_behavior no_return_description |
Fetches all manga entries on the specified user's list, identified by username or numeric user ID via 'user'. Returns the list entries grouped by status, including scores and progress. |
remove_list_entry |
name_restates_behavior no_return_description |
Removes the list entry identified by AniList list 'id' from the authorized user's list. Requires login. Returns confirmation of the deletion. |
update_list_entry |
name_restates_behavior no_return_description |
Updates the list entry identified by AniList list 'id' on the authorized user's list, applying the fields in 'options' such as status, score, progress, and dates. Requires login. Returns the updated list entry. |
get_anime |
no_return_description |
Get detailed information about anime by AniList ID(s), accepting a single ID or array of IDs. Set 'fullData' to true for the complete unfiltered record (can be large); defaults to a trimmed set of essential fields. Returns the matching anime record(s). |
favourite_anime |
name_restates_behavior no_return_description |
Toggles favourite status for an anime identified by 'id' on the authorized user's account (favourites it if not already favourited, unfavourites it otherwise). Requires login. Returns the anime's updated favourite status. |
favourite_manga |
name_restates_behavior no_return_description |
Toggles favourite status for a manga identified by 'id' on the authorized user's account (favourites it if not already favourited, unfavourites it otherwise). Requires login. Returns the manga's updated favourite status. |
get_manga |
no_return_description |
Get detailed information about manga by AniList ID(s), accepting a single ID or array of IDs. Set 'fullData' to true for the complete unfiltered record (can be large); defaults to a trimmed set of essential fields. Returns the matching manga record(s). |
get_character |
no_return_description |
Get information about a character by their AniList ID or name. Returns the character's details, including name, description, and associated media appearances. |
favourite_character |
name_restates_behavior no_return_description |
Toggles favourite status for a character identified by 'id' on the authorized user's account (favourites it if not already favourited, unfavourites it otherwise). Requires login. Returns the character's updated favourite status. |
favourite_staff |
name_restates_behavior no_return_description |
Toggles favourite status for a staff member identified by 'id' on the authorized user's account (favourites it if not already favourited, unfavourites it otherwise). Requires login. Returns the staff member's updated favourite status. |
get_todays_birthday_characters |
name_restates_behavior no_return_description |
Fetches characters whose birthday falls on the current date, paginated via 'page'. Returns a page of matching character records. |
get_todays_birthday_staff |
name_restates_behavior no_return_description |
Fetches staff members whose birthday falls on the current date, paginated via 'page'. Returns a page of matching staff records. |
get_staff |
no_return_description |
Get information about a staff member by their AniList ID or name. Returns the staff member's details, including name, roles, and associated media. |
get_recommendation |
no_return_description |
Get an AniList recommendation by its ID. Returns the recommendation's details, including the source and recommended media and rating. |
get_recommendations_for_media |
no_return_description |
Get AniList recommendations for a specific media identified by 'mediaID', paginated via 'page' and 'perPage' (max 25). Returns a page of recommended media entries. |
search_activity |
no_return_description |
Search for activities on AniList by a specific 'activityID' or by criteria in 'filter' (user, media, type, date range, etc.), paginated via 'page' and 'perPage'. Returns a page of matching activity entries. |
search_anime |
no_return_description |
Search for anime using a 'term' query string and/or structured 'filter' criteria (genre, tag, format, status, dates, scores, sort, etc.), paginated via 'page' and 'amount'. Returns a page of matching anime records. |
search_character |
no_return_description |
Search for characters matching a 'term' query string, paginated via 'page' and 'amount'. Returns a page of matching character records. |
search_manga |
no_return_description |
Search for manga using a 'term' query string and/or structured 'filter' criteria (genre, tag, format, status, dates, scores, sort, etc.), paginated via 'page' and 'amount'. Returns a page of matching manga records. |
search_staff |
no_return_description |
Search for staff members matching a 'term' query string, paginated via 'page' and 'amount'. Returns a page of matching staff records. |
search_studio |
no_return_description |
Search for studios matching a 'term' query string, paginated via 'page' and 'amount'. Returns a page of matching studio records. |
search_user |
no_return_description |
Search for AniList users matching a 'term' query string, paginated via 'page' and 'amount'. Returns a page of matching user profiles. |
delete_thread |
name_restates_behavior no_return_description |
Deletes the forum thread identified by 'id'. Requires login and thread ownership/permission. Returns confirmation of the deletion. |
get_thread |
no_return_description |
Get a specific forum thread by its AniList ID. Returns the thread's details, including title, body, and author. |
get_thread_comments |
name_restates_behavior params_unexplained no_return_description |
Fetches comments posted on the forum thread identified by 'id', paginated via 'page' (page number to retrieve) and 'perPage' (comments per page). Returns a page of comment records. |
get_full_user_info |
no_return_description |
Get a user's complete profile and stats information, identified by username or numeric ID via 'user'. Returns combined profile, favourites, and statistics data for the user. |
follow_user |
name_restates_behavior no_return_description |
Toggles the follow relationship between the authorized user and the account identified by 'userID' (follows if not already followed, unfollows otherwise). Requires login. Returns the updated follow status. |
get_authorized_user |
name_restates_behavior no_return_description |
[Requires Login] Retrieves the AniList profile of the currently authenticated user, based on the active login session/token. Returns the authorized user's profile details. |
get_user_recent_activity |
name_restates_behavior no_return_description |
Fetches recent activity entries for the user identified by numeric AniList 'user' ID (username strings are not accepted). Returns a list of the user's most recent activity entries. |
get_user_profile |
no_return_description |
Get a user's AniList profile, identified by username or numeric ID via 'user'. Returns the user's basic profile information (bio, avatar, banner, etc.). |
get_user_stats |
no_return_description |
Get a user's AniList statistics, identified by username or numeric ID via 'user'. Returns the user's anime/manga statistics such as counts, scores, and genre breakdowns. |
update_user |
name_restates_behavior no_return_description |
[Requires Login] Applies the settings in 'options' (e.g. about text, title language, notification options, list display options) to the authorized user's account. Returns the updated user settings. |
Selection evidence
14 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_user_activity |
get_user_recent_activity |
high | Both fetch a user's activity feed by numeric user ID with nearly identical descriptions ('fetch activities from a user' vs 'get recent activity from a user'); a request like 'show me this user's recent activity' could plausibly route to either. |
get_activity |
get_user_activity |
medium | Names differ only by 'user', and a phrase like 'get user 123's activity' could be misparsed as needing get_activity with a numeric ID rather than get_user_activity which fetches a feed for that user. |
get_recommendation |
get_recommendations_for_media |
medium | A task like 'get recommendations for this anime' names media but the agent could pick get_recommendation (which expects a recommendation ID, not a media ID) instead of the media-scoped tool. |
get_thread |
get_thread_comments |
medium | 'Get thread 42 and show what people said' plausibly needs comments, but the shorter get_thread name may be picked first since both take the same 'id' parameter shape. |
post_message_activity |
post_text_activity |
medium | Both post/update an activity given similar text+id schemas; a generic 'post an update to my activity feed' request doesn't clearly indicate whether it's a direct message (needs recipientId) or a public text post, risking the wrong tool being chosen. |
add_list_entry |
update_list_entry |
medium | Both share an identical options schema; a request like 'add this to my completed list' for media already on the list actually requires update_list_entry, but the word 'add' naturally maps to add_list_entry. |
get_user_profile |
get_user_stats |
medium | Both take the same username/ID param and return user-centric info; 'tell me about this user's anime stats' vs generic 'user info' requests could be misrouted between profile and stats. |
get_authorized_user |
get_user_profile |
medium | 'Get my profile' (the logged-in user) could be handled by either get_authorized_user (no params, current user) or get_user_profile (requires explicit username/ID), causing ambiguity about which to call for 'my own' profile. |
get_character |
get_staff |
medium | Both look up a person-like entity by ID or name with identical schemas; a query naming a real person who is also voiced/portrayed as a character (or ambiguous as to fictional vs real) could be routed to the wrong tool. |
favourite_character |
favourite_staff |
medium | Identical schema (single numeric id) and near-identical descriptions; favouriting a person by name without specifying 'character' or 'staff' explicitly could lead to the wrong favourite_* tool. |
search_character |
search_staff |
medium | Both take a bare search term with identical schemas; searching for a name that could belong to either a fictional character or a real staff member (e.g., a voice actor sharing a name) creates genuine ambiguity. |
search_anime |
search_manga |
medium | Identical schemas and near-identical descriptions; a title that exists as both an anime and manga (common on AniList) searched without specifying medium could be misrouted. |
get_user_anime_list |
get_anime |
low | 'Get their anime list' vs 'get anime info' are usually distinguishable by presence of a username vs an ID, but the overlapping 'anime list' phrasing could still cause a momentary mismatch. |
get_user_manga_list |
get_manga |
low | Same pattern as the anime equivalent: 'manga list' phrasing overlaps but parameter types (username vs ID) usually disambiguate. |
Compare the field