0.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 4%, 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
22.2 / 30
03Economics
16.1 / 20
04Discoverability
12.0 / 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.
14 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 |
|---|---|---|
get_mission |
no_return_description |
Get full details of a saved drone mission, including all waypoints, generation settings, and area polygon. Returns the full mission object matching the given ID. Use list_missions to find available mission IDs. |
create_mission |
no_return_description |
Create a new drone mission manually with custom waypoints. Supported types: waypoint, grid, orbit, spiral, panorama, corridor. Returns the newly created mission object with its assigned ID. For automated survey generation with optimal waypoint placement, use generate_grid_survey, generate_orbit_mission, or other generate_* tools instead. |
update_mission |
params_unexplained no_return_description |
Update an existing mission's name, type, waypoints, tags, or linked drone profile. Fetches the current version and merges your changes — omitted fields remain unchanged. 'name' sets the mission's display name, 'type' changes its mission type (waypoint, grid, orbit, spiral, panorama, corridor), 'tags' replaces the mission's tag list, and 'drone_profile_id' links (or unlinks, if null) an associated drone profile. Returns the updated mission object. Use list_missions to find mission IDs. |
delete_mission |
no_return_description |
Permanently delete a mission and all its waypoints. This action cannot be undone. Returns a confirmation of deletion. Use list_missions to find mission IDs. |
duplicate_mission |
no_return_description |
Create a full copy of an existing mission including all waypoints and settings. The new mission gets a unique ID. Returns the newly created duplicate mission object. Use list_missions to find mission IDs. |
share_mission |
no_return_description |
Generate a public share link for a mission. Anyone with the link can view the mission details and waypoints. Returns the generated share URL. Use list_missions to find mission IDs. |
import_litchi |
no_return_description |
Import a Litchi CSV file and create a new waypoint mission from it. Parses the standard Litchi CSV format (latitude, longitude, altitude, heading, gimbal pitch, actions). Automatically saves the imported mission to your account and returns the newly created mission object with its ID and waypoint count. |
create_drone |
params_unexplained no_return_description |
Create a new drone profile with manufacturer and model information. Optionally include camera specs and flight characteristics, including 'max_speed_mph' for the drone's top speed (used for flight time and coverage estimates). Created profiles can be linked to missions for flight time and coverage estimates. Returns the newly created drone profile object with its assigned ID. |
update_drone |
params_unexplained no_return_description |
Update an existing drone profile's manufacturer, model, nickname, serial number, camera specs, or flight characteristics. Pass only the fields you want to change — omitted fields remain unchanged. 'model' sets the drone's model name, 'camera_model' sets the name of its onboard camera, and 'max_speed_mph' sets its top speed (used for flight time estimates). Returns the updated drone profile object. Use list_drones to find drone IDs. |
delete_drone |
no_return_description |
Permanently delete a drone profile. This action cannot be undone. Fails if the drone is currently referenced by any missions — unlink it from missions first. Returns a confirmation of deletion. |
generate_orbit_mission |
params_unexplained |
Generate an orbit/POI mission that flies a circle around a point of interest. All waypoints face the center for consistent framing. 'drone_profile_id' optionally links the generated mission to an existing drone profile (UUID from list_drones). Automatically saves the mission to your account — returns the saved mission with ID and waypoint count. |
generate_panorama_mission |
params_unexplained |
Generate a panorama capture mission at a fixed hover location. Creates a grid of heading/pitch combinations for photo stitching. 'drone_profile_id' optionally links the generated mission to an existing drone profile (UUID from list_drones). Automatically saves the mission to your account — returns the saved mission with ID and photo count. |
generate_spiral_mission |
params_unexplained |
Generate a spiral survey mission expanding outward or contracting inward from a center point. Useful for search patterns or radial coverage. 'drone_profile_id' optionally links the generated mission to an existing drone profile (UUID from list_drones). Automatically saves the mission to your account — returns the saved mission with ID and waypoint count. |
generate_corridor_mission |
params_unexplained no_return_description |
Generate a linear corridor mapping mission along a path (roads, pipelines, power lines). Creates parallel flight passes with camera-based spacing for full coverage. 'drone_profile_id' optionally links the generated mission to an existing drone profile (UUID from list_drones). Automatically saves the mission to your account and returns the saved mission with ID and waypoint count. Call list_cameras first to see available camera_model values. |
Selection evidence
Confusable tool pairs.
11 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_active_tfrs |
get_notams |
high | Both return active flight restriction info for a location (TFRs are commonly reported as a NOTAM subtype in the real world), so a task like 'check for flight restrictions near this location' plausibly maps to either tool. |
check_airspace |
check_live_traffic |
medium | Both take lat/lng and answer 'is it safe/clear to fly here' style questions; a vague task like 'check for traffic or hazards at this location' could be routed to either the airspace-restriction check or the live-aircraft check. |
generate_orbit_mission |
generate_panorama_mission |
medium | Both generate a capture mission centered on a single point (center_lat/center_lng) intended for 360-style imagery; a task like 'get me a 360 view of this landmark' is ambiguous between a flying orbit and a fixed-hover panorama grid. |
generate_orbit_mission |
generate_spiral_mission |
medium | Both take a center point and radius-based parameters for circular flight patterns; a task like 'fly a circular pattern around this point with varying distance' could plausibly be routed to either orbit or spiral. |
list_drones |
list_cameras |
medium | Drone profiles include camera specs (camera_model, fov, mp), so a task like 'what cameras do I have available' could be resolved via list_drones (actual owned drones) or list_cameras (generic presets for survey planning). |
get_mission |
export_mission |
medium | Both retrieve mission content; a task like 'give me the mission data/details' is ambiguous between fetching the JSON representation (get_mission) and exporting to a flight-controller file format (export_mission). |
get_mission |
share_mission |
medium | A task like 'get me the mission for X' could mean retrieve full details (get_mission) or produce a link others can view (share_mission), since both surface mission contents. |
create_mission |
duplicate_mission |
medium | A task like 'create a new mission like the one I flew last week' is ambiguous between manually re-creating waypoints via create_mission and copying the existing one via duplicate_mission. |
create_drone |
update_drone |
medium | A task like 'set up my drone profile with these specs' is ambiguous about whether the profile already exists, risking confusion between create_drone (new profile) and update_drone (modify existing). |
duplicate_mission |
export_mission |
low | Both produce 'a copy' of a mission, but duplicate_mission stays in-account while export_mission is a file conversion, so ambiguity only arises if the task vaguely says 'copy this mission' without specifying format or destination. |
get_mission |
duplicate_mission |
low | Both descriptions mention 'full' details/waypoints/settings, so a task like 'give me a full copy of this mission' could be misrouted to get_mission (view) instead of duplicate_mission (actual copy). |
Compare the field