0.0 / 30
What changed in the harness
Selection accuracy 92→94, 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.9 / 30
03Economics
18.0 / 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.
19 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_close |
no_return_description |
Close the current page and release its resources. Returns nothing useful on success. |
browser_resize |
name_restates_behavior no_return_description |
Set the browser window viewport size to the given width and height in pixels, which affects layout, responsive styling, and element visibility. Both values are required. Returns nothing useful on success. |
browser_handle_dialog |
no_return_description |
Handle the currently active JavaScript dialog (alert, confirm, prompt, or beforeunload) by either accepting or dismissing it. Accept must be set; provide promptText only for prompt dialogs to type the response. Returns nothing useful on success. |
browser_evaluate |
no_return_description |
Evaluate a JavaScript expression in the context of the page, optionally scoped to a target element. Functions can be user-provided such as `() => { /* code */ }` or `(element) => { /* code */ }` when an element is provided. The return value of the function is returned as text, or written to the given filename. |
browser_file_upload |
no_return_description |
Trigger a file chooser and upload one or more files using the given absolute paths. If paths is omitted, the file chooser is cancelled. Returns nothing useful on success. |
browser_fill_form |
no_return_description |
Fill multiple form fields at once using the provided field definitions, each referencing a target element with a human-readable name, field type (textbox, checkbox, radio, combobox, or slider), and value. Checkbox values must be `true` or `false`; combobox values are option text. Returns nothing useful on success. |
browser_press_key |
no_return_description |
Press a key on the keyboard of the focused page, simulating either a named key such as `ArrowLeft` or `Enter`, or a character such as `a`. Useful for shortcuts, navigation, and confirming inputs. Returns nothing useful on success. |
browser_type |
no_return_description |
Type or fill text into an editable target element. Optionally press Enter afterward to submit the text, and optionally type one character at a time to trigger page key handlers. Returns nothing useful on success. |
browser_navigate |
no_return_description |
Navigate the current browser page to the given URL, waiting for the page to load. Returns nothing useful on success. |
browser_navigate_back |
no_return_description |
Navigate the current page back to the previous entry in the browser history. Returns nothing useful on success. |
browser_run_code_unsafe |
name_restates_behavior no_return_description |
Run an arbitrary Playwright code snippet in the Playwright server process to perform page interactions that aren't covered by other tools. The code is a JavaScript function invoked with a single `page` argument, e.g. `async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }`. Unsafe: this executes arbitrary JavaScript in the server process and is RCE-equivalent. The function's return value is returned, or loaded from `filename` if given. |
browser_take_screenshot |
no_return_description |
Capture a screenshot of the current page viewport, optionally capturing the full scrollable page or a specific element. Use this only for visual inspection; use browser_snapshot to take actions. The image is returned in the requested format (png or jpeg) and scale (css or device pixels), or saved to the given filename. |
browser_snapshot |
no_return_description |
Capture an accessibility snapshot of the current page (or a specific element via target) and return it as structured text describing the page's interactive elements, which is the recommended way to understand the page for taking actions. You can limit the snapshot tree depth, include each element's viewport-relative bounding box, or save the snapshot to a markdown file. |
browser_click |
no_return_description |
Perform a click on the target element, optionally double-clicking, choosing the button (left, right, or middle), and pressing modifier keys. Returns nothing useful on success. |
browser_drag |
no_return_description |
Perform a drag-and-drop operation from the start element to the end element, using the given target references. Returns nothing useful on success. |
browser_hover |
no_return_description |
Move the mouse cursor over the target element on the page, which can trigger hover styles, menus, and tooltips. Returns nothing useful on success. |
browser_select_option |
no_return_description |
Select one or more options in a dropdown target element by their values, which can be a single value or multiple values. Returns nothing useful on success. |
browser_tabs |
no_return_description |
List, create, close, or select a browser tab using the given action (list, new, close, or select). For new tabs, optionally provide a url to navigate to; for close/select, use the tab index, closing the current tab if index is omitted. Listing returns the current tab information. |
browser_wait_for |
no_return_description |
Wait for a condition on the page: the given text to appear, the given textGone to disappear, or a specified time in seconds to pass. Returns nothing useful on success. |
Selection evidence
Confusable tool pairs.
1 pair where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
browser_network_requests |
browser_network_request |
high | Names differ only by plurality and both describe 'network requests'. A task like 'get the network request details' or 'show me the headers/body of the network requests' is ambiguous: browser_network_requests only returns a numbered list, while browser_network_request returns full details but requires the index that network_requests prints. Vague phrasing like 'give me the request details' can lead the agent to pick the wrong member, especially before it realizes the cross-reference. |
Compare the field