0.0 / 30
What changed in the harness
Selection accuracy 90→86, token cost up 15%, 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.0 / 30
03Economics
19.2 / 20
04Discoverability
11.3 / 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.
15 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 |
|---|---|---|
browser_navigate |
name_restates_behavior no_return_description |
Loads the given URL in the active browser tab and resolves when navigation is considered complete. Use waitUntil 'domcontentloaded' to return sooner on heavy or media-rich pages, or the default 'load' when you need the full page load finished. |
browser_click |
params_unexplained no_return_description |
Clicks an element identified by a snapshot ref (e.g. "e12") or a CSS selector. Use button to choose which mouse button to press (left, right, or middle) and doubleClick to perform a double click instead of a single click (e.g. to trigger interactions that require it). Resolves once the click event has been dispatched. |
browser_type |
no_return_description |
Types the given text into an input element identified by a snapshot ref or CSS selector, optionally clearing the field first when clear is true. Use this to fill forms, search boxes, or text areas. Resolves once the text has been entered. |
browser_scroll |
params_unexplained no_return_description |
Scrolls the page or a specific element identified by selector. Use direction to choose scroll direction (up, down, left, or right) with amount as the pixel distance, or scroll to a specific element via toElement or a named position (top/bottom). Works with virtual scroll containers used by social media sites. Resolves once the scroll has been performed. |
browser_press_key |
no_return_description |
Presses a keyboard key or combination (e.g. Enter, Escape, Tab, ArrowDown, or 'a'), optionally holding modifier keys (ctrl, alt, shift, meta) for shortcuts like Ctrl+A or Cmd+C. Use ref or selector to focus an element first if needed. Resolves once the key press has been dispatched. |
browser_wait |
no_return_description |
Waits until an element (selector) reaches the given state (visible, hidden, or attached) within the timeout, or waits a fixed delay in ms if delay is set. Use this for SPAs and dynamically loaded content before taking further actions. Resolves when the condition is met or the timeout expires. |
browser_screenshot |
params_unexplained no_return_description |
Captures a screenshot of the currently visible page area and returns the image. Use format to choose PNG (default) or JPEG, and quality to set JPEG compression (0-100, ignored for PNG). |
browser_console |
no_return_description |
Reads the console messages (log, warn, error) emitted by the page and returns them, optionally clearing the message list after reading when clear is true. Use this to inspect page errors or debug output. |
browser_network |
no_return_description |
Reads the network requests made by the page and returns them, optionally filtered by a URL regex pattern (filter). Set clear to clear the captured requests after reading. Use this to inspect API calls, failed requests, or page traffic. |
browser_tabs |
no_return_description |
Manages browser tabs. Use action to list open tabs, create a new tab (supply url), close an existing tab (supply tabId), or focus a tab (supply tabId). Resolves with the current or updated list of tabs after the action completes. |
browser_text |
no_return_description |
Extracts and returns the raw text content of the whole page or of the element matched by selector, truncated to maxLength characters. Use this to read visible page content for scraping or verification. |
browser_hover |
no_return_description |
Moves the mouse cursor over an element identified by a snapshot ref or CSS selector to trigger tooltips, dropdown menus, or hover states. Resolves once the hover has been performed. |
browser_select |
no_return_description |
Selects an option from a dropdown/select element identified by a snapshot ref or CSS selector. Choose the option by its value, its visible label, or its 0-based index. Resolves once the selection has been made. |
browser_click_text |
no_return_description |
Clicks an element by its visible text content, matched as a substring (or exact match when exact is true) against the first line of each element's text. Use index to pick among multiple matches. Works on React dropdowns, portals, and overlays that may not appear in snapshots and is CSP-safe (no eval). Resolves once the click has been dispatched. |
browser_handle_dialog |
no_return_description |
Handles a JavaScript dialog (alert, confirm, or prompt) that is blocking page interaction by accepting or dismissing it via action, optionally entering text for prompt() dialogs via promptText. Resolves once the dialog has been handled and the page is unblocked. |
Selection evidence
Confusable tool pairs.
7 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
browser_click |
browser_click_text |
high | Both tools perform a click and differ only in locator strategy (ref/CSS selector vs visible text). A task like 'click the button labeled Submit' or 'click the element containing Add to cart' fits both definitions exactly, so an agent could reach for browser_click and need a ref/selector it lacks, or for browser_click_text when a selector was intended. |
browser_text |
browser_click_text |
medium | The names are nearly identical and both mention text/element. A task phrased as 'get the text on the Sign in button' maps to browser_text, while 'click the element with text Sign in' maps to browser_click_text; an agent could misroute a 'select/act on the text X' instruction to the reading tool instead of the clicking tool. |
browser_hover |
browser_select |
medium | Both definitions explicitly reference dropdowns: hover describes triggering 'dropdown menus' and select describes 'dropdown/select element'. A task like 'use the dropdown to pick France' could lead an agent to hover (thinking it performs the interaction) instead of calling select, or to call select when hovering was needed to open the menu first. |
browser_click |
browser_evaluate |
low | browser_evaluate is defined as covering 'any operation not covered by other tools', so a task like 'click the button programmatically via JS' or a click that keeps failing with normal tools could prompt an agent to dispatch a synthetic click (el.click()) through evaluate instead of browser_click. |
browser_find |
browser_evaluate |
low | Finding elements overlaps: browser_find locates elements via natural language, while browser_evaluate is explicitly for 'DOM queries'. A task like 'find all buttons on the page' or 'count the matching elements' fits both, so an agent could pick evaluate with document.querySelectorAll where the find tool was intended, or vice versa. |
browser_console |
browser_evaluate |
low | The word 'console' in browser_console is a trap: a task like 'run this JavaScript in the console' or 'log X to the console' involves executing JS (browser_evaluate), but the matching name could pull the agent to the message-reading tool browser_console instead of the evaluation tool. |
browser_press_key |
browser_handle_dialog |
low | Dialog handling overlaps with keyboard input: a task like 'press Enter to dismiss the alert' or 'accept the popup' could plausibly be satisfied by browser_press_key (Enter) or by browser_handle_dialog (accept), since dialogs block interaction until handled and a key press is a common user-level way to describe that. |
Compare the field