01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→98, token cost up 1%, 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
21.9 / 30
10.3 / 20
12.7 / 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
12 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 |
|---|---|---|
anilist_export |
no_return_description |
Export a user's anime or manga list as CSV or JSON for backup or migration. Use when the user wants to download, back up, or transfer their list data. Returns the exported list data as a CSV or JSON string (per the format parameter) containing titles, statuses, scores, and progress. |
anilist_whoami |
no_return_description |
Check which AniList account is authenticated and verify the token works. Use when the user wants to confirm their setup or debug auth issues. Returns the authenticated user's AniList username and ID, or an error if the token is missing or invalid. |
anilist_rate |
no_return_description |
Score an anime or manga on your list. Use when the user wants to give a rating (0-10). Scores display in the user's preferred format (3/5/10/100-point). Use 0 to remove. Requires ANILIST_TOKEN. Returns the updated list entry's score and entry ID. |
anilist_delete_from_list |
no_return_description |
Remove an entry from your anime or manga list. Pass either a list entry ID or a media ID. Requires ANILIST_TOKEN. Returns confirmation of the deletion, including the removed entry's ID. |
anilist_undo |
no_return_description |
Undo the last write operation (update progress, add to list, rate, delete, or batch update). Restores the previous state of the affected list entry. Requires ANILIST_TOKEN. Returns the restored entry's status, progress, and score after rollback. |
anilist_favourite |
no_return_description |
Toggle favourite on an anime, manga, character, staff member, or studio. Calling again on the same entity removes it from favourites. Requires ANILIST_TOKEN. Returns the entity's resulting favourite state (favourited or unfavourited). |
anilist_activity |
no_return_description |
Post a text activity to your AniList feed. Use when the user wants to share a status update, thought, or message. Requires ANILIST_TOKEN. Returns the created activity's ID and posted text. |
anilist_batch_update |
params_unexplained no_return_description |
Apply a bulk action to multiple list entries matching a filter. Use when the user wants to move all low-scored titles to Dropped, add all planning titles to current, or bulk-change statuses. The filter object selects which entries match (by status, score-below/above thresholds, or unscored state), and the action object defines what to change (a new status and/or score) on every matched entry. Defaults to dry-run mode (preview only, no changes applied) — set dryRun to false to execute. Requires ANILIST_TOKEN. Returns the matched entries with their current or newly applied status and score, depending on dryRun. |
anilist_group_pick |
no_return_description |
Find anime or manga for a group to watch together. Finds titles on multiple users' planning lists (or highly rated by all). Use when friends want to pick something everyone will enjoy. Returns ranked picks showing how many of the group's lists each title appears on plus its score and genres. |
anilist_shared_planning |
no_return_description |
Find titles on both users' planning lists. Use when two users want to see what they're both planning to watch or read. Returns the overlapping titles both users plan to watch, plus each user's unique planning titles. |
anilist_follow_suggestions |
no_return_description |
Find AniList users with similar taste from your following list. Ranks people you follow by taste compatibility to highlight your best matches. Requires ANILIST_TOKEN for following list access. Returns a ranked list of followed users with their compatibility percentage and shared genres. |
anilist_react |
no_return_description |
Like or reply to an AniList activity. Use when the user wants to interact with an activity from their feed. Requires ANILIST_TOKEN. LIKE toggles the like state. Returns the resulting like state for LIKE, or the posted reply's ID and text for REPLY. |
Selection evidence
30 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
anilist_genres |
anilist_genre_list |
high | Both surface genre info; 'show me genres' could hit either anilist_genres (browse top titles in a genre) or anilist_genre_list (list valid genre names) since names are nearly identical. |
anilist_list |
anilist_genre_list |
low | Share the 'list' token but serve very different purposes (user's anime list vs valid genre names); a well-formed request rarely conflates them, though truncated tool names could confuse a matcher. |
anilist_pick |
anilist_group_pick |
medium | 'What should we watch?' from a user implying friends could be routed to solo anilist_pick if the agent misses the multi-user cue, since both recommend from planning lists. |
anilist_search |
anilist_staff_search |
low | A query naming a person (director/VA) could ambiguously go to general search vs staff_search, though anilist_search is typed for media not people. |
anilist_search |
anilist_studio_search |
low | Searching 'MAPPA' could plausibly be tried in generic search before realizing anilist_studio_search is the dedicated tool, but descriptions clearly separate media vs studio queries. |
anilist_seasonal |
anilist_seasonal_stats |
medium | 'What's my seasonal record' vs 'what's airing this season' are easily confused since both are named seasonal and username vs season/year params overlap in a request like 'how did this season go for me'. |
anilist_staff |
anilist_staff_search |
high | Asking 'who voiced X in this show' vs 'search for voice actor X' both plausibly route to either tool since anilist_staff is per-title credits and anilist_staff_search is per-person works; overlapping VA/staff intent makes selection ambiguous. |
anilist_stats |
anilist_seasonal_stats |
medium | 'Show me my stats' is ambiguous between overall stats and seasonal pickup/completion stats; user may need to specify season vs overall to disambiguate. |
anilist_taste |
anilist_taste_card |
high | 'Show me my taste profile' vs 'make me a taste card image' differ only in output format (text vs shareable PNG), easily conflated by a natural request that doesn't specify image vs text. |
anilist_wrapped |
anilist_wrapped_card |
high | 'Give me my year in review' is ambiguous between the text wrapped summary and the shareable wrapped_card image; both trigger on identical year-recap phrasing. |
anilist_mal_import |
anilist_kitsu_import |
medium | If the user just says 'import my list and recommend anime' without specifying MAL or Kitsu, the agent must infer platform from subtle username hints, risking wrong tool choice. |
anilist_taste_card |
anilist_wrapped_card |
medium | Both generate shareable PNG cards summarizing genres/scores; 'make me a card about my anime' could ambiguously target taste profile vs year-in-review card if year isn't mentioned. |
anilist_compat_card |
anilist_wrapped_card |
low | Both are shareable card generators but compat_card explicitly requires two users, making confusion less likely except in vague 'make us a card' requests. |
anilist_taste_card |
anilist_compat_card |
low | Compat_card's required two-username schema distinguishes it from single-user taste_card, though both are 'shareable profile image' style tools. |
anilist_add_to_list |
anilist_delete_from_list |
low | Opposite actions (add vs remove) sharing list vocabulary; unlikely true confusion since intent verbs (add/start vs remove/delete) are distinct, but could occur in ambiguous 'update my list for X' phrasing. |
anilist_genre_list |
anilist_add_to_list |
low | Only shared token is 'list'; genre_list returns genre taxonomy while add_to_list mutates a user's list, unlikely to be confused by a real task. |
anilist_genre_list |
anilist_delete_from_list |
low | Only shared token is 'list'; functions are unrelated (genre taxonomy vs list entry deletion), minimal real ambiguity. |
anilist_seasonal |
anilist_seasonal_recap_card |
medium | 'Give me a recap of this season' could be routed to either browsing seasonal anime or generating the seasonal_recap_card image depending on whether user wants a personal recap vs airing list. |
anilist_staff_search |
anilist_studio_search |
low | Both are entity search tools with similar schemas, but 'staff/person' vs 'studio' queries are usually clearly distinguishable by named entity type. |
anilist_update_progress |
anilist_batch_update |
low | 'Update my progress' for a single show is clearly update_progress, while batch_update is for bulk filter-based changes; only vague 'update my list' phrasing risks confusion. |
anilist_taste_card |
anilist_seasonal_recap_card |
low | Both are shareable card generators but scoped differently (overall taste vs single season); a vague 'make me a card' request could misfire without season/taste context. |
anilist_wrapped_card |
anilist_seasonal_recap_card |
medium | 'Recap my year' vs 'recap my season' are similar phrasing patterns; a user recapping a partial year (a season) could trigger the wrong recap-card tool. |
anilist_compat_card |
anilist_seasonal_recap_card |
low | Compat_card strictly requires two users, making confusion with the single-user seasonal_recap_card unlikely in practice. |
anilist_recommendations |
anilist_reviews |
low | 'What do people think of X' (reviews) vs 'what's similar to X' (recommendations) are distinct intents, though both are community-driven info about a title. |
anilist_details |
anilist_recommendations |
low | anilist_details includes a recommendations section, so 'get recommendations for X' might ambiguously be satisfied by fetching full details instead of the dedicated recommendations tool. |
anilist_activity |
anilist_feed |
medium | 'Post to my feed' vs 'show my feed' could be confused since activity posts text to the feed while feed reads it; ambiguous phrasing like 'check my activity' could go either way. |
anilist_add_to_list |
anilist_rate |
low | add_to_list optionally takes a score, so 'rate this and add to my list' could plausibly be handled by either tool alone. |
anilist_rate |
anilist_delete_from_list |
low | Unrelated actions (scoring vs removing); minimal real-world confusion despite shared list vocabulary. |
anilist_search |
anilist_characters |
low | Searching a character name in generic search vs anilist_characters could occur if user doesn't clarify they mean a character rather than a title. |
anilist_taste |
anilist_compare |
low | 'Compare my taste' vs 'show my taste profile' differ in requiring two users for compare; ambiguity only in vague single-mention requests. |
Compare the field