0.0 / 30
What changed in the harness
Selection accuracy 94→98, token cost up 2%, 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
25.0 / 30
03Economics
14.2 / 20
04Discoverability
13.1 / 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.
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 |
|---|---|---|
addPolygon |
params_unexplained |
Draw a polygon area from geographic coordinate tuples. Set clampToGround to true (default) to lay the polygon flat on the terrain surface; when false, the polygon is positioned at the coordinates' heights instead. outlineColor sets the border color in CSS format (default #FFFFFF). Returns { success, data: { entityId }, message? }; keep entityId for removeEntity. |
addPolyline |
params_unexplained |
Draw a path or route from geographic coordinate tuples. Set clampToGround to true (default) so the line snaps to and follows the terrain surface; when false, the line stays at the heights given in the coordinates. Returns { success, data: { entityId }, message? }; keep entityId for removeEntity. |
updateEntity |
params_unexplained |
Update the position, appearance, label, or visibility of an existing entity. Pass show: false to hide the entity while keeping it in the scene, or show: true to make it visible again. Returns { success: boolean, data?: unknown, message?: string, error?: string }. |
setLayerVisibility |
params_unexplained |
Show or hide a managed layer without deleting it. Set visible to true to display the layer in the scene or false to hide it; the layer and its data remain managed and can be re-shown later. Returns { success: boolean, data?: unknown, message?: string, error?: string }. |
updateLayerStyle |
params_unexplained |
Update vector, imagery, primitive, or 3D Tiles styling for the layer identified by layerId, the unique identifier of an existing layer in the scene whose style is being modified. Returns { success: boolean, data?: unknown, message?: string, error?: string }. |
highlight |
params_unexplained |
Highlight one feature or every feature in the GeoJSON layer identified by layerId, the unique identifier of an existing GeoJSON layer whose features are to be highlighted; pass featureIndex to target a single feature or omit it to highlight all features. Returns { success: boolean, message?: string, error?: string }. |
list_toolsets |
no_return_description |
List all available tool groups and their enabled status; call this to discover additional capabilities before asking the user to configure anything. Returns a list of tool groups together with whether each is currently enabled. |
enable_toolset |
no_return_description |
Enable the tool group named toolset (e.g. camera, animation, entity-ext) so its tools become available; call list_toolsets first to see the available groups. Returns a success status indicating whether the tool group was enabled. |
listSessions |
name_restates_behavior no_return_description |
Enumerate the currently connected browser sessions and their connection state so you can pick a sessionId for multi-browser routing. Returns a list of sessions, each with its ID and connection state. |
Selection evidence
Confusable tool pairs.
6 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
addGeoJsonLayer |
addGeoJsonPrimitive |
high | Both take identical GeoJSON data/url inputs and produce layers; descriptions differ only in rendering approach (styled layer vs large-dataset primitives), so a task like 'add this GeoJSON' is genuinely ambiguous. |
addPolygon |
addPolyline |
medium | Both draw from the same coordinate-tuple format and differ only in minCoordinate count and 'area' vs 'path/route' wording, so a vague task like 'draw this shape from these points' is ambiguous. |
addMarker |
addLabel |
medium | A task like 'add a label at these coordinates' name-matches addLabel, but addLabel requires a full GeoJSON FeatureCollection plus field, while addMarker directly accepts coordinates and a label text field. |
updateEntity |
updateLayerStyle |
low | Both update appearance of on-page content; which tool applies depends on whether the target was created as an entity or as a managed layer, which a task like 'restyle those points' does not state. |
removeEntity |
removeLayer |
low | A task like 'remove the thing I added' is ambiguous between entities (keyed by entityId) and managed layers (keyed by id), since both descriptions have similar remove semantics over disjoint families. |
getEntityProperties |
getLayerSchema |
low | Both read metadata about on-page content; 'get info on that feature' is ambiguous between an entity (entityId) and a layer (layerId), and both descriptions mention properties/metadata. |
Compare the field