01Safety
0.0 / 30
What changed in the harness
Selection accuracy 94→92, token cost up 13%, 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
19.6 / 30
18.0 / 20
10.3 / 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
23 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 |
|---|---|---|
bugherd_get_user_tasks |
name_restates_behavior params_unexplained |
Retrieve the tasks assigned to a specific BugHerd user, identified by user_id (find IDs via bugherd_list_users). Optionally narrow results by status or priority and page through them with page. Returns the matching tasks with their IDs, descriptions, statuses, and priorities. |
bugherd_get_user_projects |
name_restates_behavior params_unexplained |
Retrieve the BugHerd projects that a specific user (user_id) can access, useful for determining where a member or guest works before reading their tasks. Returns each accessible project's name, ID, and URL. |
bugherd_list_active_projects |
name_restates_behavior |
List only the currently active BugHerd projects accessible to the authenticated user, excluding archived or closed boards. Returns each active project's name, ID, and URL, e.g., to decide which project to work in. |
bugherd_get_project |
name_restates_behavior |
Retrieve full details for a single BugHerd project identified by project_id, such as its name, development URL, and active/public flags. Useful to confirm a project's configuration before updating it or operating on its tasks. |
bugherd_create_project |
no_return_description |
Create a new BugHerd project with the required name and development URL (devurl), optionally setting is_active or is_public. Returns the newly created project together with its project_id for use in subsequent task, column, and member operations. |
bugherd_update_project |
no_return_description |
Update settings of an existing BugHerd project (project_id), such as its name, development URL, or active/public status. Returns the updated project reflecting the new settings. |
bugherd_delete_project |
no_return_description |
DESTRUCTIVE: permanently delete a BugHerd project (project_id) along with all of its tasks. This cannot be undone; returns confirmation of which project was deleted. |
bugherd_add_member |
no_return_description |
Add an existing team member (user_id) to a BugHerd project so they can view and work on its tasks. Returns confirmation that the membership was added. |
bugherd_add_guest |
no_return_description |
Add a guest/client to a BugHerd project, providing either their user_id or email; supply one of the two. Returns confirmation of the guest being added to the project. |
bugherd_list_archived_tasks |
name_restates_behavior |
List the tasks that have been archived (removed from the active taskboard) for a project, paginated with page. Returns the archived tasks with their IDs, descriptions, and statuses, e.g., to audit or restore old work. |
bugherd_create_task |
params_unexplained no_return_description |
Create a new task/bug in a BugHerd project from a description, optionally setting priority, status/column, tag_names, an assignee (assigned_to_id), a requester_email (the client/customer who reported the bug, used for notifications), and an external_id for your own reference. Returns the created task and its task_id. |
bugherd_move_tasks |
no_return_description |
Move one or more tasks (task_ids) out of a source project (project_id) into a destination project (destination_project_id). Returns the outcome of the move so you can confirm which tasks were relocated. |
bugherd_update_task |
no_return_description |
Update attributes of an existing task (task_id) in a project, e.g., its status (use a column name from bugherd_list_columns to mark it done or move it through workflow), priority, description, or assignee (assigned_to_id; pass null to unassign). Returns the updated task. |
bugherd_get_column |
name_restates_behavior params_unexplained |
Retrieve details for a single Kanban column (status) of a project (project_id), identified by column_id, such as its name and position. Useful to look up a column name before using it as a task status. |
bugherd_create_column |
no_return_description |
Create a new column (status) with the given name at a position in a project's Kanban board. Returns the created column and its column_id so you can reference it when setting task statuses. |
bugherd_update_column |
no_return_description |
Rename or reposition an existing Kanban column (column_id) in a project's board. Returns the updated column with its current name and position. |
bugherd_create_comment |
params_unexplained no_return_description |
Post a comment with the given text on a task (task_id) in a project, optionally attributing it to a user via user_id or email. Returns the created comment. |
bugherd_list_attachments |
params_unexplained |
List every attachment attached to a task (task_id) in a project, returning each attachment's ID, filename, and URL so you can later fetch or delete specific ones. |
bugherd_get_attachment |
name_restates_behavior params_unexplained |
Retrieve details for a single attachment (attachment_id) on a task (task_id) in a project, such as its filename, URL, and metadata, e.g., to locate or download the file attached to a bug. |
bugherd_create_attachment |
params_unexplained no_return_description |
Attach a file to a task (task_id) by giving its url and the file_name to display for it. Returns the created attachment and its attachment_id. |
bugherd_delete_attachment |
params_unexplained no_return_description |
DESTRUCTIVE: permanently delete an attachment (attachment_id) from a task (task_id) in a project. This cannot be undone; returns confirmation of the deletion. |
bugherd_create_webhook |
no_return_description |
Create a webhook that POSTs an event notification to target_url whenever a chosen event (project_create, task_create, task_update, comment, or task_destroy) occurs, optionally scoped to a project_id. Returns the created webhook so you can confirm its configuration. |
bugherd_delete_webhook |
no_return_description |
DESTRUCTIVE: permanently delete a webhook (webhook_id) so it no longer receives event notifications. Returns confirmation of the deletion. |
Selection evidence
9 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
bugherd_get_task |
bugherd_get_task_global |
medium | A task like get the details of task 12345 is ambiguous about ID namespace: bugherd_get_task requires a project_id plus task_id, while bugherd_get_task_global fetches purely by global ID, so an agent holding only a task ID can pick the wrong one and fail. |
bugherd_get_task |
bugherd_get_task_by_local_id |
medium | Users quote the visible #123 local IDs in BugHerd, so get task #123 in project 5 may send the local number into bugherd_get_task's task_id field instead of bugherd_get_task_by_local_id's local_task_id. |
bugherd_get_task_global |
bugherd_get_task_by_local_id |
medium | A flat get task 123 leaves whether 123 is a global or project-scoped local ID unresolved, since one tool only takes a global ID and the other requires project_id plus local_task_id. |
bugherd_get_user_tasks |
bugherd_get_task |
low | When a request mentions both a user and a task, e.g. get the task John is working on, the agent may route on the task noun to bugherd_get_task rather than the user-based listing, or confuse which ID (user vs task) it holds. |
bugherd_list_projects |
bugherd_list_active_projects |
low | A plain list projects or show my current projects request carries no active/inactive signal, so the general listing and the active-filtered tool are both surface matches yet return different sets. |
bugherd_list_tasks |
bugherd_list_archived_tasks |
low | Neither description states whether bugherd_list_tasks includes archived tasks, so list all tasks in project 5 can be routed to the generic listing or the archived-only tool depending on inference. |
bugherd_list_tasks |
bugherd_list_feedback_tasks |
medium | bugherd_list_tasks is itself described as listing tasks (bugs/feedback), so show me the feedback for project 3 plausibly matches both the generic list and the unprocessed/new feedback-specific tool, yielding different results. |
bugherd_list_tasks |
bugherd_list_taskboard_tasks |
low | show the taskboard or list the tasks in the doing column for project 5 can be routed to the generic status-filtered listing as easily as to the taskboard-specific tool, and the returned sets differ since feedback and archived are excluded. |
bugherd_add_member |
bugherd_add_guest |
medium | add user 5 to project 3 without specifying team member vs guest/client is genuinely ambiguous; bugherd_add_member takes only user_id while bugherd_add_guest also accepts an email, so the role must be inferred from context. |
Compare the field