01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→98, token cost up 16%, 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
24.3 / 30
20.0 / 20
14.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
8 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_categories |
name_restates_behavior no_return_description |
Return all available feed categories (seo, content, social, email, analytics, crm, news) that can be used to organize and filter RSS feeds, so you can pick a valid category before adding a feed. |
list_feeds |
name_restates_behavior no_return_description |
Return all currently configured RSS feeds together with their assigned category, showing which sources are tracked and how they are grouped for use in fetching, searching, and removal. |
add_feed |
name_restates_behavior no_return_description |
Register a new RSS feed by URL and a display name, optionally assigning it to a category (seo, content, social, email, analytics, crm, news). Returns confirmation that the feed was added and made available for fetching and searching. |
remove_feed |
name_restates_behavior no_return_description |
Delete a tracked RSS feed identified by its feed name. Returns confirmation that the feed was removed and will no longer appear in fetches or searches. |
fetch_blogs |
name_restates_behavior no_return_description |
Retrieve the latest articles published across all configured feeds, optionally restricted to a date range (1d, 7d, 1w, 30d, 1m, this_week, this_month; default 7d) and capped to a maximum count (default 20). Returns a list of matching blog articles. |
fetch_by_category |
name_restates_behavior no_return_description |
Retrieve the latest articles from feeds assigned to one specific category (seo, content, social, email, analytics, crm, news), optionally restricted by date range (default 7d) and a maximum count (default 20). Returns the matching blog articles. |
fetch_from_source |
name_restates_behavior no_return_description |
Retrieve the latest articles from a single feed source identified by its name, optionally restricted by date range (default 7d) and a maximum count (default 20). Returns the matching blog articles. |
search_blogs |
no_return_description |
Find blog articles across all feeds whose content matches a given keyword or phrase, optionally restricted by date range (default 30d) and a maximum count (default 20). Returns the matching articles, useful for discovering content ideas on specific topics. |
Selection evidence
5 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
fetch_by_category |
fetch_from_source |
high | Both fetch blogs filtered by a single user-provided selector (category vs. source/name), and only the parameter name differs. A task like 'get blogs from news' or 'fetch blogs from techcrunch' forces the agent to guess whether the given value is a category name or a feed source without reliable clues. |
fetch_blogs |
fetch_by_category |
medium | A task like 'fetch recent marketing blogs' is ambiguous: fetch_blogs pulls from all feeds with a range/limit, while fetch_by_category filters by a category that may actually be the topic the user mentions. Agents can pick the wrong scope when the user's category word isn't an obvious known category. |
fetch_blogs |
fetch_from_source |
medium | 'Fetch blogs from [named feed]' could lead an agent to call fetch_blogs (all feeds) if it treats the request as generic 'latest blogs', or fetch_from_source if it recognizes a source name; both return articles and only differ in the optional name filter, making the intent easy to misread. |
fetch_blogs |
search_blogs |
medium | A task like 'find recent AI content across my feeds' contains both a range/limit flavor (fetch_blogs) and a topic/keyword flavor (search_blogs). Since both return blog articles and neither description names the other, an agent may choose fetch_blogs and miss the keyword-based filtering the user actually wants. |
list_categories |
list_feeds |
medium | A task like 'list my feed categories' is ambiguous: list_categories returns available categories for organizing, while list_feeds returns configured feeds with their assigned categories. The agent could choose list_categories when the user actually wants to see which categories their feeds belong to, which is only covered by list_feeds. |
Compare the field