0.0 / 30
What changed in the harness
Selection accuracy 98→96, token cost down 0%, unconfirmed writes 0%→0%.
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
26.6 / 30
03Economics
19.5 / 20
04Discoverability
13.6 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
4 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 |
|---|---|---|
create_draft |
no_return_description |
Create a new draft post and store it in your drafts. Accepts markdown body which is converted to Substack's format. Does NOT publish — creates a draft only. Returns the new draft's id, title, and metadata. |
update_draft |
no_return_description |
Update an existing, unpublished draft post. Only works on drafts that have not been published. Accepts markdown body. Returns the updated draft's id, title, and metadata. |
create_note |
no_return_description |
Create a Substack Note (short-form content). Accepts markdown text. PUBLISHES IMMEDIATELY to your public Notes feed — Notes have no draft state on Substack, and this server has no delete tools, so there is no undo from here. Returns the created note's id and URL. |
create_note_with_link |
no_return_description |
Create a Substack Note with a link attachment, displayed as a rich card below the note text. Accepts markdown body and a URL to attach. PUBLISHES IMMEDIATELY to your public Notes feed — same caveats as create_note: no draft state, no undo from this server. Returns the created note's id and URL. |
Selection evidence
Confusable tool pairs.
8 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
create_note |
create_note_with_link |
high | A user asking to 'post a note with a link' or 'share this URL as a note' may land on create_note (which only takes a body) instead of the link-attachment variant, both described as publishing notes to the same feed. |
get_post |
get_draft |
medium | Both fetch full content of a single piece by ID; an agent handed a bare ID without being told whether it is published or still a draft can pick the wrong one, especially since users often say 'get post X' for drafts. |
get_post |
get_post_analytics |
medium | A task like 'get me the info/data on post 123' is ambiguous between full content (get_post) and performance stats (get_post_analytics), and both take a post_id. |
get_post |
get_post_comments |
low | Mildly ambiguous for 'show me how post 123 did with readers', but descriptions are clear enough that 'get comments' or 'get content' will generally steer correctly. |
get_post_comments |
get_post_analytics |
medium | Both are post_id-based engagement lookups; a request like 'how did this post perform / what's the feedback on it' could plausibly go to either, since analytics also returns a comments count. |
list_published_posts |
list_scheduled_posts |
medium | 'List my posts' or 'show what's coming up' is genuinely ambiguous between already-published and scheduled/queued content, and neither name signals the distinction clearly to a casual task. |
list_published_posts |
list_drafts |
medium | 'Show me my posts' or 'what content do I have' could pick published posts while the user actually wants drafts (and vice-versa); both are paginated listing tools with identical inputs. |
create_draft |
create_note |
low | A request to 'write a short post/note about X' is ambiguous between a long-form draft and an immediate short-form Note, though the descriptions do distinguish format and publishing behavior. |
Compare the field