01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 10%, 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
25.8 / 30
19.5 / 20
12.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
9 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 |
|---|---|---|
schedule_post |
no_return_description |
Schedule a social post to one or more connected accounts for a FUTURE time (it publishes automatically). Set validate_only=true to check accounts/limits/timing without scheduling. Returns the scheduled post's id, which you can use later with get_post, update_post, or cancel_post. |
list_posts |
params_unexplained |
Return your posts, newest first, each with its id and status. Optionally filter by status (comma-separated, e.g. "pending,posted"). limit: maximum number of posts to return (1-100). offset: number of posts to skip before returning results, for pagination. |
update_post |
params_unexplained no_return_description |
Update a post that has not yet published and return its updated id and status. id: the post id from list_posts or get_post. content: the new post text (optional if media_urls provided). account_ids: account ids, from list_accounts, the post goes to (at least one). scheduled_for: the new ISO 8601 future datetime to publish. media_urls: public image/video URLs to attach. platform_content: per-platform text overrides, e.g. {"twitter":"shorter text"}. options: per-platform format options, e.g. {"instagram":{"as_reel":true}}. thread: multi-post threads, e.g. {"x":["1/…","2/…"]}. |
cancel_post |
params_unexplained no_return_description |
Cancel a scheduled post before it publishes; already-published posts cannot be cancelled. id: the id of the scheduled post to cancel, from list_posts or get_post. Returns the cancelled post's id and its updated status. |
get_account_analytics |
params_unexplained |
Return recent posts and their engagement metrics (likes, comments, views, etc.) for one connected account — the reliable analytics surface. account_id: the connected account id from list_accounts. |
get_post_analytics |
params_unexplained |
Return per-channel engagement metrics for a specific post you scheduled (best-effort; use get_account_analytics for the full picture). id: the id of the scheduled post, from list_posts or get_post. |
get_best_times |
params_unexplained |
Return personalized best posting times for one connected account, computed from its own engagement history. Requires the Professional plan or higher. Hours are UTC; shift to the poster's timezone. Use them to pick scheduled_for. account_id: the connected account id from list_accounts. |
list_mentions |
params_unexplained |
Return your social-listening mentions — who is talking about the keywords you track (reddit/bluesky/youtube/hackernews/…), newest first. platform: filter to one platform, e.g. "reddit". since: ISO datetime; only mentions published after this. unread: if true, return only mentions not yet read. limit: maximum number of mentions to return. offset: number of mentions to skip, for pagination. |
post_comment |
no_return_description |
Post a comment/reply to one of your posts. account_id from list_accounts; target_id is the platform post/media/comment id to comment on. Supported: instagram, facebook, linkedin. Returns the posted comment, including its id. |
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 |
|---|---|---|---|
get_post |
get_post_analytics |
medium | Both take a post id and report on a single post; a vague task like 'check how my post is doing' or 'what happened with post X' could pull status/channel outcome from get_post when the user actually wants engagement metrics, or vice versa. |
get_account_analytics |
get_post_analytics |
medium | A task like 'get the engagement analytics' is ambiguous on scope: get_post_analytics is for one specific post while get_account_analytics covers recent posts and is explicitly billed as the 'reliable full picture', so an agent could choose the wrong one for a single-post analytics request. |
schedule_post |
update_post |
medium | A task like 'move my post to tomorrow' or 'reschedule my post for 3pm' could trigger schedule_post (scheduling a post at a time) instead of update_post (editing the existing post's time), since both operate on posts and time and aren't distinguished by the verb alone. |
get_account_analytics |
get_best_times |
low | Both describe data computed from a connected account's engagement history ('recent posts and engagement metrics' vs 'best times computed from engagement history'); a request like 'what does my account's engagement say' could misdirect to get_best_times, though each output type is fairly distinct. |
list_posts |
list_mentions |
low | Both are 'newest first' listing tools with nearly identical surface phrasing ('list your posts' vs 'list mentions, newest first') and start with 'your'; a generic task like 'show me the latest social activity' is ambiguous, though the post-vs-mention domain split usually disambiguates. |
Compare the field