SceneScout
SceneScout is an MCP server that turns your coding agent into an exploratory UI tester: it attaches to a live web app, drives the browser, audits structure and design, and writes a gap-checked markdown report.
Explore & crawl — scan a project for routes/framework/auth states, attach a real browser (Chromium/Firefox/WebKit), and sweep every known route in a single
scout_crawlcall with per-route health summaries.See the app structurally — snapshots list elements with layout geometry and diff on re-snapshot with stable refs; overlap, off-screen, scroll-lock, and broken-image issues are computed from boxes; screenshots are a last resort.
Act like a user — click (including a double-click double-submit probe), type, select, press keys, scroll, hover for tooltips, navigate/back, upload valid generated fixtures, or batch up to 20 mechanical actions in one
scout_run_plan.Measure quality —
scout_design_auditscores a11y, contrast, spacing, and design-system coherence;scout_journeymeasures task ease via interaction count, screens, and backtracks.Stay safe by design — write policy enforced at the network layer:
observe(GET-only), defaultread-only,safe-write(only what this run created), anddestructiveonly with explicit user opt-in.Remember across runs — state fingerprints and coverage persist in
.scenescout/, durable knowledge goes to ASSUMPTIONS.md, and findings dedupe on machine signals with repro traces and regression-test skeletons.Report honestly — generates
.scenescout/report.mdwith findings, page scores, a role capability matrix, and an explicit gap ledger;extensivelevel refuses to finalize while any known gap remains.Multi-role, concurrent — keep several authenticated sessions alive at once (e.g. admin + qa) and dispatch to them in parallel, merging coverage into one memory.
Enables exploratory UI testing of Angular applications, including route discovery from Angular router configuration to plan coverage and measure completeness.
Enables exploratory UI testing of Next.js applications, including route discovery from file-based routing to plan coverage and measure completeness.
Enables exploratory UI testing of Nuxt applications, including route discovery from file-based routing to plan coverage and measure completeness.
Enables exploratory UI testing of applications using React Router, including route discovery from its router configuration to plan coverage and measure completeness.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SceneScoutExplore our staging app at staging.example.com and report any broken flows or coverage gaps"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🔭 SceneScout
Exploratory UI testing, driven by the AI agent you already use.
Works with Claude Code · Cursor · VS Code (Copilot) · Codex CLI · Gemini CLI · Copilot CLI · Windsurf · any MCP client
👀 See it work · ✨ Why · 🎯 Two ways to use it · 🚀 Quickstart · 🧰 Toolbox · 🔌 Other clients · 🔒 Safety · 🩺 Troubleshooting
SceneScout is an MCP server that hands an agent a structured view of a running web app — every element, its geometry, and a set of always-on correctness oracles — and lets the agent explore it like a curious user. Your coding agent is the brain; SceneScout is the hands, eyes, and memory. Any MCP client can drive it, and the testing method comes with the server, so the agent knows how to use the tools wherever it runs.
┌─────────────────────┐ MCP (stdio) ┌───────────────────────────────┐
│ Your coding agent │ ──────────────▶ │ SceneScout engine │
│ (intent, judgment, │ ◀────────────── │ Playwright · oracles · memory │
│ your subscription) │ tool results │ findings · report — no LLM │
└─────────────────────┘ └───────────────────────────────┘Scripted E2E suites answer one question — "does this exact flow still work?" — and say nothing about the 95% of the app they don't touch. SceneScout covers both gaps: it finds what's broken (crashes, dead ends, permission leaks) and reports how the product could be better (confusing flows, weak hierarchy, design-system drift), with concrete measurements.
👀 See it work
This is a real run against the small demo app bundled in this repository. The app has bugs planted in it on purpose, and two of them are visible on its dashboard:
The broken chart is the demo app's bug, not this page's — it is one of the ten findings SceneScout filed, next to the badge sitting on a button. The red callouts were added for this README; the unmarked screenshots are the ones the engine took.
An excerpt of the report it wrote — read the whole thing:
🔴 [HIGH] A double-click on Create order creates two orders Evidence:
2× click fired the same state-changing request 2× (POST /api/orders)The submit button stays enabled while the request is in flight, and the endpoint accepts the repeat.🔴 [HIGH] Filtering orders by Archived fails, and the page shows an empty table instead of an error Evidence:
GET /api/orders?status=archived → HTTP 500🟠 [MEDIUM] The "New: bulk import" badge sits on top of the All orders button (callout 1) Evidence:
"All orders" overlaps "New: bulk import" (81%)— measured from layout boxes, no screenshot needed.🟡 [LOW] The dashboard chart image is missing (callout 2) Evidence:
GET /img/weekly-chart.png → HTTP 404Gap ledger — what was NOT tested: 4/7 visited routes never design-audited · single-role run, so permission boundaries are untested
Every finding comes with a repro trace and a Playwright regression-test skeleton. To try it yourself, clone this repository, run npm run demo:serve, then /scenescout --url http://127.0.0.1:4173 — see demo-app/. Its README lists every seeded defect and which oracle catches it.
Related MCP server: PixelCheck
✨ Why it's different
🧠 Your agent is the brain — no API key. The engine contains no LLM. Exploration runs on the agent and subscription you already have (Claude Code, Cursor, Copilot, Codex, Gemini CLI and others); SceneScout just gives it deterministic tools and the method for using them.
📐 Structured scene, not pixels. The agent reads element lists with layout geometry, not screenshots. Overlap and off-screen bugs are computed from boxes — deterministic, no vision guessing. Images that failed to load are read from the DOM too. (Screenshots exist only for pixel-native residue like a canvas or a rendering glitch.)
🛡️ Read-only by default, enforced on the wire. Destructive actions are blocked at the network layer, not by asking the model nicely. Opt into writes only against disposable data.
✅ Completion is a contract, not a vibe. The engine knows the app's routes and refuses to file an "extensive" report while any known route is unvisited, unexercised, or un-audited. "Explored a bit and stopped" is structurally impossible.
🧭 It remembers. UI states are fingerprinted and stored in the project's
.scenescout/. Run N+1 skips what run N already covered, and every run starts smarter than the last.
🎯 Two ways to use it
SceneScout needs only a URL. Give it the source code as well and it gets noticeably better.
🏠 Next to the codebase (recommended) | 🌐 Against a remote URL | |
You run it from | the app's repository | any folder — an empty |
It plays the role of | a developer-tester who can read the code | a black-box QA tester, like a person with a browser |
How it finds pages | 📂 reads routes from the source and follows links: file-based routing (Next.js, SvelteKit, Nuxt) and router configuration written in code (React Router, Vue Router, Angular). Routes built at runtime are not seen | 🔗 follows same-origin links only — pages nothing links to, or on another subdomain, stay unknown |
"Did we cover everything?" | checked against the routes found in source plus discovered links — an unvisited one blocks the report | checked against the pages it managed to discover |
Setup it figures out | framework, dev command, saved Playwright logins ( | none — you pass the URL, and the path to a login state if the app needs one |
What a finding looks like | the symptom, plus the file behind it and a suggested fix | the symptom, a repro trace, and a regression-test skeleton |
Typical target |
| staging, a preview deploy, a client's site |
Why the codebase helps. The agent driving SceneScout is a coding agent, which can already read your repository. With the source at hand it knows the app's static routes before opening the browser, so coverage is measured against the real app instead of whatever happened to be linked. It can also check a suspicion against the code before reporting it: "there is no way to export this table" is a much stronger finding once the agent has confirmed no export handler exists. And when something breaks it can open the component or handler responsible and tell you where and how to fix it — "the save button does nothing" becomes "OrderForm swallows the rejected promise in onSubmit; surface the error and re-enable the button".
Why it still works without it. Everything SceneScout observes comes from the running page — elements, layout geometry, console and network errors, design-audit scores, task-ease measurements — and none of that needs source code. Point it at a URL you are allowed to test and it behaves like a thorough QA tester: it explores, reproduces, and files findings with evidence.
# next to the code — run inside the app's repository
/scenescout --url http://localhost:3000
# remote — run from any folder; memory and the report are kept there
/scenescout --url https://staging.example.com --role ./auth/qa.jsonOnly test sites you own or are authorized to test. A remote environment is more likely to hold real data, so for a remote URL with no source the skill attaches inobserve mode: nothing but GET requests leaves the page. The default read-only mode blocks PUT/PATCH/DELETE and destructive-looking requests, but an ordinary form submission (a plain POST: contact form, comment, order, signup) still reaches the server and can create a record. Say so when that is acceptable on your target. See the safety model.
🚀 Quickstart
📦 Prerequisites
Node | ≥ 20 |
An MCP client | Claude Code, Cursor, VS Code with Copilot, Codex CLI, Gemini CLI, GitHub Copilot CLI, Windsurf, or any other |
A web app to test | SceneScout tests a live app: start yours locally first (e.g. |
1️⃣ Install
It is on npm. Nothing to clone:
npx -y scenescout install # Claude Code: skill + server + Chromium (one-time download)
npx -y scenescout install --client cursor # or: vscode, codex, gemini, copilot, windsurf (comma-separated for several)Either way it downloads the browser and registers the server with the client you named. Claude Code also gets the method as a skill; every other client receives the same method from the server. What each client gets.
Prefer a Claude Code plugin? The skill and the server arrive together:
/plugin marketplace add brunoboto96/SceneScout
/plugin install scenescout@scenescout-marketplaceThen download the browser once with npx -y scenescout install --browser-only. The command becomes /scenescout:scenescout. A plugin's skill comes from this repository and its server from the latest npm release, so right after a release lands here the two can differ for a short while; /plugin marketplace update scenescout-marketplace brings the skill up to date.
A client that is not in that list? Run npx -y scenescout install --browser-only and add the server to its config by hand.
puts the
/scenescoutskill into~/.claude/skills/(or$CLAUDE_CONFIG_DIR/skills/) — ascenescoutfolder it didn't create is moved aside to a.backup-…copy, never deleted,downloads the browser SceneScout drives (skipped if you already have it). By default that is Chromium, as two builds: the full browser for headed runs and the headless shell every other run uses. Choose something else with
--browsers,registers the MCP server with Claude Code at user scope. Run through
npx, the launcher isnpx -y scenescout serve, with the absolute path ofnpxwhere one sits beside node, so it works under nvm/fnm. From a clone or a global install it is the absolute node path plus that install'sdist/mcp-server.js.
Re-run it any time: after moving the folder or switching node versions it refreshes the stored paths. It exits non-zero if any step failed, so it is safe to chain. Opt out of a step with --no-register or --skip-browser.
If claude isn't on the PATH of the shell you ran it from, it prints the registration command instead of running it:
claude mcp add --scope user scenescout -- npx -y scenescout serve2️⃣ Check it
npx -y scenescout doctor --engine # any client: node + build + browser
npx -y scenescout doctor # Claude Code: the above, plus the skill and the registrationEvery line should be a ✓. Anything that isn't prints the exact command that fixes it. Then start a fresh session in your client so it picks up the new tools.
3️⃣ Run it
No app handy? Clone this repository and run npm run demo:serve: the demo app starts on http://127.0.0.1:4173.
Open your agent inside the project you want to test (or, for a remote URL, any folder) and ask:
Use SceneScout to test http://localhost:3000 at medium levelIn Claude Code the skill gives you a command with flags for the same thing:
/scenescout --level medium --url http://localhost:3000 --role qaThe agent scans the project (if there is one), attaches read-only, explores, and writes findings to .scenescout/report.md. That's it.
Common flags — --level minimal|medium|extensive · --url <app> · --role <name\|path> (a Playwright storage-state to explore as: a name found by the scan, or a path to the JSON file) · --observe / --safe-write / --allow-destructive.
🔄 How a run works
One curiosity loop, repeated — breadth first, then judgment where it matters:
scan ──▶ attach ──▶ crawl ──▶ investigate ──▶ measure ──▶ report
│ │ │ │ │ │
routes browser every route reproduce & journeys + gap-checked
& auth (r/o) in ONE call file findings design audit markdownScan the project — framework, routes, auth states.
Attach a browser (read-only unless you said otherwise).
Crawl every known route in a single call — per-route HTTP status, element counts, oracle violations, dead ends.
Investigate what the crawl flagged: navigate, snapshot, reproduce, file a structured finding.
Measure task ease (
scout_journey) and design quality (scout_design_audit) on representative pages.Report — the engine checks the gap ledger and writes
.scenescout/report.md.
Snapshots are cheap: re-snapshotting a route returns only what changed, with stable refs (measured on a 130-element page: 10.7 kB → 0.7 kB).
🧰 The toolbox
25 deterministic tools. The agent picks; you rarely call these by hand.
Phase | Tools | What they do |
Set up |
| Hand the testing method to an agent that has no skill loaded; discover routes; launch a browser in a write-mode; keep several authenticated roles alive at once |
Explore |
| Sweep every route in one call; ask what's still untested |
Look |
| Read the structured scene (diffed); reveal tooltips/hover cards; capture pixels only when needed |
Act |
| Drive the UI like a user; |
Assess |
| Score a page's craft/a11y/consistency; measure how hard a task is to complete |
Record |
| Curate durable notes; file deduped findings; mark fixes; generate the report |
Close |
| Tear down one session or all |
A few that punch above their weight:
scout_crawl— the entire breadth pass in one tool call. No visiting routes one-by-one.scout_run_plan— up to 20 actions (fill form → submit → check) with semantic targets (testid=…,text=…), aborting at the first anomaly.scout_journey— wraps one goal and reports interaction count, screens seen, and backtracks; an abandoned journey is a finding no passing E2E suite can produce.scout_upload— generates a valid in-memory fixture (real PDF/PNG, kind inferred fromaccept) so file-upload flows stop being a blind spot.scout_click {clicks: 2}— the impatient-user probe: states whether a double-click fired the same state-changing request twice (the classic double-submit bug).
📊 Test levels
Each level is an enforced contract — scout_report checks it before finalizing.
Level | What it guarantees | Rough size |
| Every route visited, ≥1 design audit, key journeys as plans, crawl problems triaged. Remaining gaps disclosed. | ~40 actions |
| minimal + design audits across several routes + every element class exercised + every form submitted valid and invalid | ~150 actions |
| medium + fuzzing, back/refresh/deep-link resilience, keyboard-only pass, a journey per module, ≥2 roles compared, anonymous auth-surface walk. Refuses to finalize while any gap remains. | budget-capped |
That refusal is the guarantee: an extensive report can only exist when nothing known was left untested.
🔒 Safety model
🔵
observe(--observe) lets nothing butGETrequests leave the page. The one exception is what a session needs in order to exist: logging in, logging out and refreshing a token. Signing up, changing or resetting a password and creating users are blocked like any other write. WebSocket frames are not inspected; the engine says so when the app opens a socket. It is what the skill picks for a remote URL with no source, where an ordinary form POST would create a real record. Forms that could not be submitted are listed in the gap ledger.🟢
read-onlyby default. Destructive-labeled elements (delete/revoke/archive/…) and allPUT/PATCH/DELETE+ destructivePOSTs are blocked at the network layer — seesrc/engine/policy.ts. Non-destructivePOSTs are allowed, because submitting forms is how a tester finds validation bugs — so read-only means nothing existing is changed or removed, not nothing is ever created.🟡
safe-write(--safe-write) lets the agent create data and edit/delete only what it created this run — never pre-existing records.🔴
destructive(--allow-destructive) allows everything, and only ever when you confirm the environment is disposable. The skill will never choose this itself.📂 Findings, memory, and reports live in a
.scenescout/folder where you ran it. It ignores itself in git, so a straygit add -Anever commits test data.
A 🛡 WRITE-POLICY blocked notice is the safety net doing its job, not an app bug.
📋 What you get
.scenescout/report.md — a deduplicated, worst-first report with:
🐛 Findings with repro traces and generated Playwright regression-test skeletons.
💯 Page scores (0–100: a11y · craft · consistency · task-clarity), ranked worst-first, with stale scores from old runs marked as such.
👥 A role capability matrix — what each role could and couldn't reach.
🧾 A gap ledger — everything not done, so the report is honest about its own coverage.
👀 Watch a run live: node dist/cli.js status <project-path>.
🩺 Troubleshooting
Run npx -y scenescout doctor first — it checks every setup item below (everything but the last row, which is about your app) and prints the fix.
Symptom | Cause and fix |
| The skill isn't linked, or the session predates it. |
The | The MCP server isn't registered, or points at an old path. |
"Executable not found in $PATH" | The server was registered with a bare |
Installed as a plugin, and the tools fail with "Executable not found in $PATH: npx" | A plugin starts the server with a bare |
"… build has not been downloaded yet" on attach | The browser download was skipped or failed, or the run asked for a browser you did not install. Run the command the message names, for example |
Tools broke after moving the folder or changing node version | The registration stores absolute paths. |
Attach fails or every route lands on the login page | Your app isn't running at |
⬆️ Upgrading from an older version
Tools are now
scout_*. Up to v0.23 they were prefixedft_. The rename happened before the first npm release, with no aliases, so an agent's context carries one tool list rather than two. Re-runnpx -y scenescout installso the installed skill matches the server.Earlier names. This tool was previously called SceneCraft (and, before that, frontend-tester).
scenescout installcleans up after both: it removes the old skill link and the oldscenecraftMCP registration when they point at this install, and the first attach in a project moves its.scenecraft/memory folder to.scenescout/so earlier coverage and findings carry over.
🧹 Uninstall
# Claude Code
claude mcp remove --scope user scenescout
rm -rf ~/.claude/skills/scenescout
# Codex / Gemini / Copilot CLI
codex mcp remove scenescout # likewise: gemini mcp remove …, copilot mcp remove …For Cursor, Windsurf and VS Code, delete the scenescout entry from the client's MCP server list.
Nothing else is installed: npx runs the package from npm's cache. Per-project memory lives in each tested project's .scenescout/ folder; delete it there if you want it gone.
🌐 Choosing browsers
install downloads Chromium and nothing else unless you ask. --browsers takes one name, a comma-separated list, or all:
| What is downloaded | About, on disk |
| the full browser and the headless shell | 550 MB |
| the headless shell only: every run works except | 200 MB |
| Firefox | 270 MB |
| WebKit, the engine behind Safari | 290 MB |
| Chromium, Firefox and WebKit | 1.1 GB |
npx -y scenescout install --browsers chromium-headless-shell # the smallest working setup
npx -y scenescout install --browser-only --browsers firefox,webkit # add two more laterSizes vary by platform. The builds go to Playwright's shared cache, so a build another tool already fetched is not downloaded again.
To drive another browser, pass browser when attaching (scout_attach { browser: "firefox" }), or set SCENESCOUT_BROWSER=webkit in the server's environment to change the default. scenescout doctor checks the browser named by that variable in the shell it runs from, so check another one with SCENESCOUT_BROWSER=webkit scenescout doctor. Two things differ outside Chromium:
Service workers are not allowed to register in Firefox and WebKit. The write policy works by intercepting requests, and only Chromium lets a request issued by a service worker be intercepted. An app that depends on its worker may behave differently there.
A Firefox or WebKit left behind by a crash is not cleaned up on the next start the way a leftover Chromium is.
In every browser, pages are not given shared workers unless the mode is destructive: a request a shared worker sends cannot be intercepted anywhere, so the app is made to do that work on the page, where the policy sees it.
🔌 Other MCP clients
The engine is a plain MCP server over stdio, so any client can drive it, and the testing method reaches the agent through the server itself (see the end of this section). install can register it for you:
npx -y scenescout install --client cursor # one client
npx -y scenescout install --client vscode,codex # several; add claude-code to keep that one too
| How it is registered |
|
|
| adds an entry to |
| VS Code's own |
|
|
|
|
|
|
| adds an entry to |
A config file that is not valid JSON is left untouched, and the entry to add by hand is printed instead; a config that is a link into a dotfiles repository is written through the link. When a client that is registered through its own command is not installed, install says so and prints the command to run later. Cursor and Windsurf are files, so their entry is written whether or not the editor is installed yet. On Windows, a client installed through npm is a .cmd shim that install cannot start; it prints the command for you to run instead. Then restart the client and ask its agent: "Use SceneScout to test http://localhost:3000".
What has been checked: registering through each command above was run against Codex CLI, Gemini CLI, GitHub Copilot CLI and VS Code, and Cursor's command line agent read the entry install wrote, connected and listed the tools. The Windsurf path follows its documentation. A full test session has been run in Claude Code, with and without the skill. If a client behaves differently for you, a correction is welcome (say which client version you checked).
To register by hand instead, the server entry is always the same command, npx -y scenescout serve:
{
"mcpServers": {
"scenescout": { "command": "npx", "args": ["-y", "scenescout", "serve"] }
}
}{
"servers": {
"scenescout": { "type": "stdio", "command": "npx", "args": ["-y", "scenescout", "serve"] }
}
}[mcp_servers.scenescout]
command = "npx"
args = ["-y", "scenescout", "serve"]{
"mcpServers": {
"scenescout": { "command": "npx", "args": ["-y", "scenescout", "serve"] }
}
}{
"mcpServers": {
"scenescout": { "command": "npx", "args": ["-y", "scenescout", "serve"] }
}
}{
"mcpServers": {
"scenescout": { "command": "npx", "args": ["-y", "scenescout", "serve"], "disabled": false, "autoApprove": [] }
}
}{
"context_servers": {
"scenescout": { "command": "npx", "args": ["-y", "scenescout", "serve"], "env": {} }
}
}Most clients accept the same mcpServers JSON shape shown for Cursor.
The method travels with the server. The tools are only hands and eyes; skills/scenescout/SKILL.md is the method: what to look at first, when to stop, what counts as a finding. Claude Code loads it as a skill. Every other client gets the same text from the server, with nothing to copy:
the server's instructions tell the agent to call
scout_playbookbefore its first attach, and that tool returns the method,clients that list server prompts as commands also get an
exploreprompt, which loads the method and takes an optional URL, level and focus.
So in any client, a first message like "Use SceneScout to test http://localhost:3000" is enough. If an agent starts clicking without having called scout_playbook, tell it to call that first; how closely a model follows server instructions varies by client.
The CLI is also useful on its own:
npx -y scenescout scan <path> # project discovery: framework, routes, saved logins
npx -y scenescout status <path> # what a running engine is doing right now📁 Project layout
src/
mcp-server.ts the 25 tools + per-session dispatch
scan.ts project discovery (framework, routes, auth)
cli.ts scan · serve · install · doctor · status
installer.ts setup logic (skill link, MCP registration, diagnostics)
engine/
browser.ts the engine class: attach, snapshot, actions, crawl, plans
probes.ts in-page scroll + overlay + focus probes (needs a browser too)
fingerprint.ts route + element-set identity (state hashing)
oracles.ts console/page/network/HTTP error detection
policy.ts the write-policy safety net
ownership.ts safe-write: which records did this run create?
uploads.ts disk uploads, fenced to the project by real path
journey.ts task-ease measurement from the action log
design.ts the design audit + page scoring
memory.ts cross-run storage + finding dedup
report.ts the gap ledger + report generation
… collector · dispatch · fixtures · authloss · reaper
scripts/ the 12 test suites (smoke/ holds the real-browser ones)
test-app/ fixtures for the real-browser smoke tests
skills/scenescout/ the testing method (SKILL.md): a skill in Claude Code, served by the server everywhere else
docs/adr/ why it's built this wayDesign principle: logic that doesn't need Playwright lives outside
browser.ts, so it can be unit-tested without launching a browser. That's whyfingerprint,policy,memory,report, etc. are their own modules.
🧠 Design decisions
The load-bearing choices are recorded as ADRs — read the relevant one before changing a rule it covers:
2 · The write policy is enforced on the wire, not in the prompt
3 · A gap-ledger entry must be actionable, and suppression must be visible
4 · Findings dedup on machine signals, and a merge must never lose a finding
🔧 Development
Working on SceneScout itself is the only reason to clone it:
git clone https://github.com/brunoboto96/SceneScout.git scenescout && cd scenescout
npm install # installs dependencies and builds
npm run setup # same as `scenescout install`, but registers THIS checkout (the skill is linked, so edits are live)
npm test # build + 12 suites: scan, oracle, policy, fixture, dispatch, design,
# contract, memory, install, hygiene, smoke, mcp-check
npm run demo # regenerate examples/ from the demo appContributing? Start with VISION.md (what is in scope) and CONTRIBUTING.md (how changes land), then see CLAUDE.md for the house rules — chiefly: bug fixes need a regression test at the cheapest layer that can fail, keep the repo project-agnostic (ADR 6), and npm test must pass.
🔐 Security
Found a way past the write policy, or another security problem? Please report it privately — see SECURITY.md.
📄 License
MIT.
Structured render-state, not pixels. Element lists with geometry; screenshots reserved for pixel-native residue (canvas, rendering glitches). Images that failed to load are reported from the DOM, including ones whose URL answered 200 with something that is not an image.
Diff snapshots with stable refs. Re-snapshots return only what changed (10.7 kB → 0.7 kB on a 130-element page); old refs stay valid.
Geometry oracles. Overlap and off-screen defects computed from layout boxes.
Oracles after every action. Console errors, page errors, failed requests, HTTP 4xx/5xx drained into every tool result.
Multi-role, genuinely concurrent. Commands to different sessions run in parallel; safe-write ownership is shared, so role A can create what role B approves. The report renders a role capability matrix.
Task ease, not just correctness.
scout_journeymeasures interaction cost, distinct screens, path, and backtracks.Design audit with page scores. Two tiers (⚠ measurable defects / → craft suggestions incl. AI-slop tells), per-page 0–100 score persisted per route, plus an automatic overlay/modal probe on every snapshot. Shared shell scored once, separately.
Scrolls like a user — and notices when it can't. Reports
SCROLL LOCKEDfor a leaked modal scroll-lock, finds the real inner scroll pane on app-shell layouts, and flagsUNREACHABLEcontrols clipped insideoverflow:hidden.Uploads like a user. Answers a styled file-chooser or sets a hidden input directly, with a valid in-memory fixture;
filePathis fenced to the project under test; files violatingacceptare flagged at selection.Auth via Playwright storage states. Expired tokens caught at attach; repeated login-bounces raise
SESSION AUTH LOST; a bounced route is recorded as not covered — a dead session can't certify routes it never reached.A trustworthy gap ledger. Entries must be actionable (a search box or wizard sub-step isn't "form filled but never submitted"); API/download URLs never enter the route contract.
Honest reporting. Shared chrome counted once, stale scores marked, role matrix compares only roles that actually attempted a route.
Cross-run written knowledge.
scout_notecurates.scenescout/ASSUMPTIONS.md— app model, personas, constraints, risks — in prose.Daemon-grade robustness. Per-tool watchdogs, orphaned-browser reaping, bounded teardown, live status via
scenescout status <project>.
Available Tools
25 toolsscout_attachA
Launch a browser and attach to a running web app. First attach in this conversation and you have read neither the SceneScout skill nor scout_playbook? Call scout_playbook before this. Write policy is enforced at the NETWORK layer: mode='observe' blocks EVERY request that is not a GET (login and token refresh excepted) — choose it for a target that holds real data, where even an ordinary form submission would create a record; mode='read-only' (default) blocks destructive-labeled elements AND all PUT/PATCH/DELETE + destructive POSTs, but lets ordinary form POSTs through; mode='safe-write' allows creating data and permits updates/deletes ONLY on resources this session created (use when the user wants create/edit flows tested); mode='destructive' allows everything — ONLY when the user explicitly confirmed a disposable/seeded environment. Pass a Playwright storage-state JSON to explore as an authenticated role. Pass session to keep MULTIPLE roles alive at once (one browser each, genuinely concurrent) for collaboration testing — target each directly with every tool's session param, or use scout_session to set which one is the default; coverage and findings merge into one project memory.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Base URL of the running app, e.g. http://localhost:3000 | |
| mode | No | Write policy (see tool description). Never choose 'destructive' yourself — user opt-in only. | read-only |
| headed | No | Show the browser window | |
| browser | No | Browser to drive. Default: the SCENESCOUT_BROWSER environment variable, else chromium. firefox and webkit must be downloaded first (scenescout install --browser-only --browsers firefox). Use them for a cross-browser pass; stay on chromium otherwise. | |
| session | No | Session name for multi-role runs (e.g. 'admin', 'qa'). Creates/replaces that session's browser and makes it the default. Default: 'default'. | |
| projectPath | Yes | Absolute path to the project (memory + report live in .scenescout/ here) | |
| viewportWidth | No | Viewport width (default 1280); use e.g. 390 for a mobile pass | |
| viewportHeight | No | Viewport height (default 900) | |
| storageStatePath | No | Optional Playwright storage-state JSON path for authenticated exploration |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does so thoroughly. It discloses network-layer write enforcement for each mode, clarifies what destructive mode permits, and explains multi-session concurrency and project-memory merging. This goes well beyond a simple 'launch browser' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is dense and front-loaded with the core action, then the prerequisite, then mode semantics, then session/auth guidance. Each section earns its place given the tool's complexity and nine parameters. It loses a point for being a somewhat run-on wall of text rather than a more structured breakdown, but it is not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and a nine-parameter tool, the description is nearly complete: it covers prerequisites, safety modes, authentication, and multi-session behavior. The main gap is that it never hints at what the agent should expect after a successful attach (e.g., a connection status or a browser session handle), which would be more important without an output schema. Still, everything needed to invoke the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters, establishing a baseline of 3, but the description adds substantial meaning for mode, session, browser, and storageStatePath. It explains the real-world implications of each mode and how session enables multi-role collaboration, which the enum/type definitions alone do not convey. The description doesn't need to restate url/projectPath since the schema already documents them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Launch a browser and attach to a running web app.' This clearly identifies the tool as the browser-attachment entry point and distinguishes it from the navigation, clicking, and scanning sibling tools. It also frames the tool's role in the conversation with the 'First attach in this conversation' prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit preconditions: call scout_playbook first if the skill/playbook hasn't been read. It also provides mode-selection guidance tied to real scenarios, such as choosing observe for real data and safe-write for create/edit flow testing, and states that destructive mode requires user confirmation. This is strong when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_backA
Go back in browser history (tests back-button resilience).
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It accurately discloses the core behavior and its testing intent, but it does not mention whether it waits for page load, how it handles missing history, or any operational side effects. For a simple non-destructive action this is acceptable, but not richly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with a purposeful parenthetical. It is front-loaded, free of filler, and every word contributes to understanding the tool's action and intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a low-complexity tool: no required parameters, no output schema, and the one optional parameter is fully explained in the schema. The description plus schema is sufficient for an agent to invoke it correctly, with only minor operational details unmentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional `session` parameter is fully documented in the input schema, including guidance on concurrent multi-session use. The description itself adds no parameter semantics, but with 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'go back in browser history.' It also adds a distinct purpose, 'tests back-button resilience,' which clearly separates it from navigation, crawling, and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is clear: use this tool to go back in browser history and exercise back-button behavior. It does not explicitly name alternatives or exclusions, so it falls just short of a 5, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_clickA
Click an element by its ref from the latest scout_snapshot. Returns the outcome plus any oracle violations triggered. clicks=2 (or 3) probes IMPATIENT-USER behaviour: a rapid multi-click that fires the same state-changing request twice means the control is not guarded against double submission (button stays enabled, endpoint not idempotent) — use it on every important submit/create button once; the result says explicitly whether duplicates fired.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref, e.g. e12 | |
| clicks | No | 1 = normal; 2-3 = rapid repeated clicks (double-submit probe) | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden of behavioral disclosure. It does a good job explaining the double-submit probe mechanism and that the result states whether duplicates fired. However, it fails to disclose general click side effects (navigation, form submission, waiting behavior, failure modes when ref is invalid) for a mutating action, leaving notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is valuable but poorly structured — it is a single long run-on sentence cramming purpose, return value, and a detailed behavioral explanation together. It would benefit from breaking the probe explanation into separate sentences and front-loading the core click purpose. Every idea earns its place, but the formatting hurts readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should fully explain return values and post-click behavior. It vaguely says 'Returns the outcome plus any oracle violations triggered' but doesn't specify what the outcome looks like, whether it waits for page loads, or what happens after navigation. The clicks probe guidance is thorough, but general click behavior is under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful value beyond the schema by explaining WHY the clicks probe matters ('fires the same state-changing request twice means the control is not guarded against double submission') and giving concrete usage guidance. This elaboration justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Click an element by its ref from the latest scout_snapshot.' It clearly distinguishes from siblings like scout_hover and scout_type by anchoring to snapshot element refs. However, it does not explicitly differentiate from scout_press, leaving slight ambiguity about boundary cases, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance for the clicks probe: 'use it on every important submit/create button once.' It also explains the double-submit detection rationale. But it offers no when-not guidance or explicit alternatives among the 25 siblings for a basic click, so it misses the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_closeA
Close a session's browser (memory persists on disk). Default: the DEFAULT session. Pass session to close a specific one, or all=true to close every live session at the end of a multi-role run.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Close every live session | |
| session | No | Session to close (default: the default session) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of exposing side effects. It directly discloses that memory persists on disk after closing, and that all=true only affects live sessions. This goes well beyond the schema's parameter descriptions and helps the agent predict the tool's impact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one compact sentence that front-loads the core function and persistence caveat, then covers all invocation modes without redundancy. Every clause contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two optional parameters, no output schema, and no annotations, the description is complete: it states what is closed, the persistence behavior, the default behavior, how to target one session, and how to close all sessions. Nothing material is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters with 100% description coverage, so the baseline is 3. The description adds useful semantic context: session targets one browser, all=true is intended for multi-role run cleanup, and omitting both closes the DEFAULT session. This extra guidance justifies a slightly higher score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Close a session's browser') and clearly distinguishes this teardown action from the other scout_* tools, which are about scanning, navigating, clicking, or reporting. It also communicates the key scope variants (default session, specific session, all sessions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage conditions: no session argument closes the DEFAULT session, session closes a named session, and all=true closes every live session at the end of a multi-role run. It does not explicitly mention when not to use this tool or name an alternative, but no sibling tool performs closing, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_coverageA
Show exploration coverage: states visited across all runs and which elements remain unexercised. Use to decide where to explore next and when the level's budget is satisfied.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral disclosure burden. It clearly indicates a read-only reporting operation via 'Show' and scopes the behavior to 'all runs' and unexercised elements. It does not mention output formatting or staleness, but for a simple coverage-reporting tool, the transparency is reasonably complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the core output definition, then immediately gives the intended decision-making use case. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description provides enough context to invoke it correctly: it defines what coverage means and when to use it. It could add output shape or formatting details, but those are not essential for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single `session` parameter is already well-documented in the schema, including concurrent versus sequential usage. The tool description adds no parameter-level detail, but the schema fully compensates, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') with a concrete resource ('exploration coverage') and defines what that means: states visited across all runs and which elements remain unexercised. This clearly distinguishes the tool from the scout_* siblings like scout_scan, scout_snapshot, or scout_navigate by focusing on aggregate coverage rather than a single action or snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Use to decide where to explore next and when the level's budget is satisfied.' This gives clear decision context, but it does not name alternatives or state when not to use it, so it falls just short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_crawlA
Engine-side route sweep in ONE call: visits each path (default: all known routes not yet visited), records states into coverage memory, and returns a per-route health summary (HTTP status, element count, oracle violations, dead-ends, auth-redirects). Navigation-only — safe in read-only mode. Use this FIRST for broad coverage; explore interactively only where it flags problems or where journeys matter.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | Paths to visit, e.g. ['/orders','/settings']. Omit to crawl all unvisited known routes. | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and largely succeeds: it discloses the mutation profile ('Navigation-only — safe in read-only mode'), a side effect (records into coverage memory), and the return contents. It does not cover rate limits, auth requirements, or whether the crawl runs synchronously, which would be useful but are not critical for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with zero filler: capability and outcome are front-loaded, safety follows, then usage strategy. Every clause earns its place, and the key differentiator ('Use this FIRST') is placed at the end as actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description compensates by enumerating the per-route health summary fields. Combined with full schema descriptions for both parameters and explicit usage guidance, almost everything an agent needs to invoke it correctly is present. Minor omissions: behavior when no unvisited routes exist and any timing/asynchronicity expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds mild conceptual context (e.g., default behavior of visiting unvisited routes, purpose of recording into coverage memory), but does not substantially extend beyond the schema's own parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Engine-side route sweep... visits each path'), enumerates concrete outcomes (records states into coverage memory, returns per-route health summary with HTTP status, element count, oracle violations, dead-ends, auth-redirects). It differentiates from siblings like scout_scan and scout_navigate by being a broad one-call sweep versus interactive exploration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Use this FIRST for broad coverage; explore interactively only where it flags problems or where journeys matter.' This gives both a when-to-use and a when-not-to-use, with the alternative approach (interactive exploration) implied, so an agent can sequence its actions correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_design_auditA
Computed-style design audit of the current page — a design connoisseur's read WITHOUT screenshots. Measurable defects (⚠): WCAG contrast, tiny targets, clipped text, aspect-distorted images, horizontal overflow, missing keyboard-focus indicators (sampled with real Tab presses). Craft suggestions (→): line measure and line-height rhythm, spacing-scale adherence, typography entropy, palette discipline (gray census, accent hue families, pure-#000 body text), elevation/control consistency, heading structure, indistinguishable links, and AI-slop tells (gradient text, glassmorphism, side-stripe borders, neon glows, violet gradients, identical card grids). Ends with a SYSTEM SUMMARY of design-system coherence. Run once per representative page; the → tier is improvement feedback — file genuine opportunities as ux-polish findings with the concrete numbers, not just defects.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does a good job: it declares the audit is computed-style without screenshots, samples keyboard focus with 'real Tab presses', and lists both measurable defects and craft suggestions. It does not address side effects or permissions, but as a read-only audit the implied behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative, with clear structure: purpose, defect types, suggestion types, summary, and usage note. It front-loads the core identity and every subsequent clause adds practical detail. A little trimming would be possible, but the length serves the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and no annotations, the description compensates well by enumerating what the audit detects, the structure (defects vs. suggestions vs. system summary), and how to use the results. It does not specify the exact return format, but the content coverage is sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, session, is already fully documented in the input schema with clear guidance on when to pass it explicitly. The description adds no additional parameter semantics, which is acceptable because schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: a 'computed-style design audit of the current page', and explicitly distinguishes itself with 'WITHOUT screenshots'. It enumerates distinct audit categories (WCAG contrast, tiny targets, clipped text, etc.), making its purpose unmistakable compared to siblings like scout_screenshot or scout_scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: 'Run once per representative page' and instructs that improvement-tier findings should be filed as ux-polish findings with concrete numbers rather than just as defects. It does not explicitly name alternative tools or exclusion criteria, but the context is specific enough to guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_findingA
Record a structured finding (bug, UX issue, or improvement). Deduplicates across runs; automatically captures the recent action trace as the repro. Use for anything worth reporting: crashes, oracle violations you confirmed, dead ends, confusing UX, permission leaks, missing testids — and design-audit improvement opportunities (ux-polish) with their concrete measurements.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | One-line summary of the defect | |
| detail | Yes | What happened, what was expected, and the evidence | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. | |
| category | Yes | Pick the closest — use 'other' only when nothing fits | |
| evidence | No | Canonical machine signature for dedup, e.g. 'GET /api/reports/dashboard 403' or 'widget dashboard-summary-widget shows 0'. Same bug re-found later should produce the same string. | |
| severity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses two key behaviors: deduplication across runs and automatic capture of the recent action trace as the repro. These are significant behavioral traits that go beyond what the schema conveys. It does not contradict anything (there are no annotations) and adds valuable context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with purpose and key behaviors in the first sentence, and a list of use cases in the second. Every sentence earns its place, and there is no redundancy or fluff. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and moderate complexity (6 params, 4 required), the description covers purpose, usage, and behavioral traits. It does not mention return values or errors, but that is not required when no output schema exists. The session parameter has detailed guidance in the schema, so the description does not need to repeat it. The description is complete enough for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83% (5 of 6 parameters have descriptions). The description does not add much about parameters beyond what the schema already provides. The evidence parameter's purpose for dedup is already in the schema. The description mentions 'concrete measurements' for ux-polish, which relates to detail, but this is marginal. Severity lacks a description but its enum values are self-explanatory. Baseline 3 is appropriate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Record' and the resource 'structured finding', and enumerates the types of findings (bug, UX issue, improvement). It also distinguishes itself from the sibling action tools by positioning it as the reporting tool, and lists specific use cases like crashes, oracle violations, dead ends, and ux-polish. This is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for anything worth reporting' and gives a comprehensive list of scenarios. It does not mention alternatives or exclusions, but the tool's purpose is clear enough that an agent would know to use it for recording findings rather than executing actions. The guidance is strong but lacks explicit when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_hoverA
Hover an element by ref like a user pausing the pointer on it, and report what it reveals: tooltips/popovers (diffed against pre-hover state), any other new page text that appeared (labelled as possibly unrelated on busy pages), the title attribute, and aria-describedby text — each item truncated to 300 chars. Hovering does not count as exercising the element. Use on badges, icons, truncated text, and error indicators BEFORE concluding an element 'does nothing' — hover-gated UI is invisible to snapshots and clicks.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref, e.g. e12 | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure responsibility. It explains that results are diffed against pre-hover state, unrelated text may be labelled, items are truncated to 300 characters, and hover does not count as exercising the element. This gives a clear and honest model of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler: the first defines behavior and outputs, the second states a key caveat, and the third provides usage guidance. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description explains the result composition, truncation, and possible noise. Combined with complete parameter schema and explicit usage conditions, an agent has everything it needs to invoke and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both ref and session already have full descriptions, including the concurrency behavior of session. The tool description adds little per-parameter detail, but that is acceptable because the schema already handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: hover an element by ref and report what it reveals. It enumerates concrete outputs (tooltips, new text, title attribute, aria-describedby) that clearly distinguish it from sibling tools like scout_click and scout_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it on badges, icons, truncated text, and error indicators before concluding an element 'does nothing', which is strong when-to-use guidance. It also notes that hovering does not count as exercising the element, implying it is not a substitute for interaction, though it does not name scout_click as the explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_journeyA
Measure how EASY a real task is, not just whether it works — the question pass/fail e2e suites never answer. Wrap one user goal: scout_journey {action:'start', goal:'Create an order'}, perform it the way a first-time user would (navigate by CLICKING through the UI, not by jumping to a known deep URL — a shortcut invalidates the measurement), then scout_journey {action:'end', completed:true|false}. Returns interaction cost (clicks, navigations, distinct screens, elapsed), the actual path taken, and friction signals: BACKTRACKS (returning to a screen already left — the clearest sign the next step wasn't discoverable), screen count, and over-interaction. Run it on each module's primary journey; an abandoned journey is a high-severity finding.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | For start: the user-facing task, e.g. 'Create an order and assign it' | |
| note | No | For end: what made it hard or easy, in one line | |
| action | Yes | 'start' before attempting the task, 'end' when done or blocked | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. | |
| completed | No | For end: did the user actually achieve the goal? false is a strong finding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so well: it discloses that the tool actually performs the journey by clicking, that shortcuts invalidate the measurement, what metrics are returned, and how to interpret abandonment. The live side-effect potential is implied by the 'Create an order' example, but the 'perform it' wording makes the behavior clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences cover purpose, lifecycle, execution rule, return metrics, and usage guidance. There is no filler; the opening contrast with pass/fail e2e orients the agent, and the lifecycle example is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description enumerates the returned interaction metrics and friction signals, defines the invalidating shortcut, and states the severity of an abandoned journey. Session handling is covered by the schema's detailed session parameter, so an agent has enough to invoke and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds a concrete usage template pairing action:'start' with goal and action:'end' with completed, plus a real example goal. It doesn't add separate semantics for session/note, but those are already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific measurement goal — task ease rather than pass/fail — and defines a clear start/end journey lifecycle with concrete signals (backtracks, interaction cost, over-interaction). This clearly distinguishes scout_journey from execution-oriented siblings like scout_click or scout_navigate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it: wrap a user goal with start/end and run it on each module's primary journey. It also emphasizes the correct execution method (clicking through UI, no deep-link shortcuts) and treats abandoned journeys as high-severity. However, it doesn't name alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_noteA
Cumulative WRITTEN knowledge about the tested app — .scenescout/ASSUMPTIONS.md, in prose a human can read and correct. memory.json stores coverage; this stores UNDERSTANDING, so every run starts smarter than the last. READ it at the start of every session ({action:'read'}). ADD durable learnings as you go ({action:'add', section, note}): what the app is for (app-model), who each role is and what they're FOR — infer the persona from what the role can see and do, e.g. 'qa-role = reviewer: approves orders, cannot administer' (roles), UI patterns the app follows (conventions), rules discovered the hard way like 'an order can only ship once approved' (constraints), fragile areas worth re-testing every run (risks), domain terms (glossary). Notes are dated, attributed to the acting role, and deduplicated. Do NOT record session-specific facts (ids, counts) — only durable knowledge.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | For add: the learning, one or two sentences, written for a future reader with no context | |
| action | Yes | 'read' the accumulated knowledge, or 'add' one durable learning | |
| section | No | For add: which knowledge section this belongs to | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that notes are dated, attributed to the acting role, and deduplicated, and that the file is human-readable and correctable. It also states that it stores understanding so every run starts smarter, implying persistence across sessions. No contradictions with annotations (none exist), and the description fully explains the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is densely informative yet well-organized. It front-loads the core purpose and file path, then explains actions with examples, lists the sections inline, and closes with a clear exclusion rule. Every sentence earns its place; there is no fluff or repetition. The use of parentheses and examples makes it scannable without losing depth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, 2 enums, and no output schema, the description covers all necessary aspects: what it does, when to use it, how to use each parameter, what content to store, and what to avoid. It even explains the file location and the distinction from memory.json. An agent could confidently call this tool correctly after reading the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all parameters have descriptions), but the description adds significant meaning beyond the schema. It explains the action enum (read/add) and how to combine with section and note, gives concrete examples of section values, and clarifies the session parameter's concurrency behavior. This enriches the agent's understanding of how to construct valid calls, far exceeding the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it stores cumulative WRITTEN knowledge about the tested app in ASSUMPTIONS.md, and supports reading and adding durable learnings. It distinguishes itself from memory.json (coverage) and from sibling tools like scout_finding by focusing on durable understanding rather than session-specific events. The verb 'read' and 'add' are explicit, and the resource (knowledge store) is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to READ at the start of every session and to ADD durable learnings as you go, with concrete examples of what to record (app-model, roles, conventions, constraints, risks, glossary) and what NOT to record (session-specific facts like ids and counts). This gives clear when-to-use guidance and even defines the exact action pattern. It implicitly differentiates from other scout tools by focusing on knowledge accumulation rather than immediate actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_playbookA
Return the SceneScout testing method: setup order, write modes, how to explore, what counts as done, how to report. Call this ONCE before the first scout_attach in a conversation, then follow it. If this client offers a SceneScout skill, load that instead — it is the same text, so never read both. Takes no input and touches no browser.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it states 'Takes no input and touches no browser,' making the read-only, side-effect-free nature clear. It also warns that calling it again is unnecessary and that it duplicates the skill text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: content, usage timing/alternative, and input/side-effect constraints. No filler, and the most decision-relevant information appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-input, no-output-schema tool, the description fully covers what the tool returns, when to invoke it, how it relates to the skill alternative, and that it has no browser side effects. Nothing an agent needs to call or follow it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema already says nothing is needed. The description adds the explicit confirmation 'Takes no input,' which aligns with the empty schema, earning the zero-parameter baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Return the SceneScout testing method' and enumerates its contents (setup order, write modes, exploration, done criteria, reporting). This clearly distinguishes it from the sibling execution tools like scout_attach and scout_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it: 'ONCE before the first scout_attach in a conversation, then follow it.' It also names an alternative and provides a rule: if a SceneScout skill is offered, load that instead and 'never read both.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_pressB
Press a keyboard key (e.g. Escape, Tab, Enter) — useful for closing modals and testing keyboard navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the action (press a key) and a common use case, but doesn't mention whether the key press is sent to the active element, whether it waits for effects, whether it can fail (e.g., no focused element), or any side effects. For a tool that sends input, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and examples, then gives a use case. It's concise and readable, though it could add a brief note on key format without bloating.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple input tool with no annotations and no output schema, the description is minimal. It doesn't explain what happens after the key press, whether a page/session must be active, or how the key should be specified (e.g., exact key names). The session parameter guidance is good, but the core behavior is under-specified for an agent to invoke reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: the 'key' parameter has no description in the schema, and the description only gives examples (Escape, Tab, Enter) without specifying format (e.g., 'Escape' vs 'Esc' vs key codes). The 'session' parameter is well-described in the schema, so the description adds little there. The description partially compensates for the undocumented 'key' parameter but doesn't fully specify accepted values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool presses a keyboard key and gives examples (Escape, Tab, Enter) plus a use case (closing modals, testing keyboard navigation). It distinguishes from siblings like scout_click and scout_type by focusing on key presses, though it doesn't explicitly name a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (closing modals, keyboard navigation testing) but doesn't explicitly contrast with alternatives like scout_type or scout_click. The session parameter description provides some guidance on when to pass session explicitly, but the main description lacks clear when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_reportA
Generate the final markdown report — findings, page quality scores (worst first), role capability matrix, oracle rollup, and the GAP LEDGER (an explicit list of what was NOT tested). Writes the full document to .scenescout/report.md and returns a bounded SUMMARY (full reports exceed client token limits). Gates by level: 'minimal' needs all routes visited + ≥1 design audit; 'medium' additionally needs several routes audited; 'extensive' REFUSES while the gap ledger is non-empty — that refusal is the completeness guarantee: an extensive report only generates when nothing known is left untested. force=true overrides (only when the user capped the budget).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Generate even though gates are unmet (only when the user capped the budget) | |
| level | No | Which completion contract to enforce — match the level the run was asked for | medium |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it delivers: it states the file write to .scenescout/report.md, the bounded summary return due to token limits, and the refusal behavior for 'extensive' when the gap ledger is non-empty. This transparency is unusually strong for a tool with no structured annotation safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: purpose, report contents, output location, return behavior, gating semantics, and override conditions. It is front-loaded with the core purpose and then layers the necessary nuance without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema or annotations, the description fully covers what the report contains, where it is written, what the tool returns, and the exact conditions under which it will or will not generate. An agent has enough context to know when to call it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all three parameters with 100% coverage, so the baseline is 3. The description adds value by defining what each gate level actually requires ('minimal' needs all routes visited + audit, etc.) and by clarifying that force overrides should only occur under a user-budget cap, enriching the level and force parameters beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Generate') and resource ('final markdown report'), and enumerates the exact contents: findings, page quality scores, role capability matrix, oracle rollup, and gap ledger. This clearly distinguishes the tool from sibling action tools like scout_scan or scout_snapshot because it produces the terminal, comprehensive report artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit gating preconditions for each level ('minimal' needs all routes visited, 'medium' needs more audits, 'extensive' refuses while the gap ledger is non-empty), effectively saying when the tool should and should not be invoked. It also explains when force=true is appropriate: only when the user capped the budget, which is a clear when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_resolveA
Mark a finding as resolved (by its id, shown when recorded and in the report). Resolved findings move to the report's green ✅ Resolved section, and reopen automatically as flagged REGRESSIONS if re-found later. Use when the user says a bug is fixed, or when re-testing shows the evidence no longer reproduces.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Alias for `findingId`. | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. | |
| findingId | No | Finding id, e.g. a1b2c3d4e5 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and meets it by disclosing behavioral consequences: resolved findings move to the green Resolved section and reopen automatically as REGRESSIONS if re-found later. This adds meaningful context beyond the schema, though it does not address potential side effects like irreversibility or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences with no filler. It front-loads the core action, then explains behavior and usage conditions. Every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage triggers, and behavioral outcomes, which is sufficient for a simple action tool with no output schema and no required parameters. It does not explicitly explain the return value, but given the tool's simplicity and the strong schema coverage, the remaining gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well-documented. The description adds minor value by hinting where to find the id ('shown when recorded and in the report'), but it does not elaborate on parameter formats beyond the schema, hence a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Mark a finding as resolved') and clearly identifies the target (by id). It distinguishes itself from sibling tools by explaining the outcome (moving to the Resolved section and auto-reopening as REGRESSIONS), which is unique to this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: when the user says a bug is fixed, or when re-testing shows the evidence no longer reproduces. It does not provide when-not-to-use guidance or name alternatives, but the usage context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_run_planA
Execute up to 20 actions in ONE call — use for mechanical sequences (fill a form, walk a wizard) so each step doesn't cost a round-trip. Targets resolve at execution time by semantic locator: 'testid=…', 'text=…', or 'label=…' (never snapshot refs). An upload step attaches a file as scout_upload does (target required — the file input or the control that opens its chooser; value = a fixture kind or a project-relative path). The plan ABORTS at the first NEW oracle violation, policy refusal, or failed step, returning a transcript of how far it got; repeats of already-reported violations do not abort (they stay logged for the report).
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | ||
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the abort-on-new-violation/failure behavior, else it returns a transcript of how far it got, and specifies that repeated violations do not abort. It also explains semantic locator resolution at execution time and upload step specifics—all beyond schema and highly valuable for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description starts with purpose, then flows to target resolution, upload exception, and abort behavior—logical and front-loaded. Every sentence earns its place, though the density of technical details makes it slightly heavy to parse. Could benefit from bullet points, but it remains concise for the information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-step tool with no annotations and no output schema, the description covers essential operational semantics: execution limits, target resolution, upload steps, and abort conditions. It lacks detail on the transcript format and domain terms like 'oracle violation', but enough is provided for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (session described well, steps not). The description compensates by explaining the steps' target syntax ('testid=…', 'text=…', 'label=…'), upload behavior, and the abort semantics. This adds meaning beyond the schema's bare enum, though not every action type is individually expanded.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Execute up to 20 actions in ONE call' and specifies the use case ('mechanical sequences (fill a form, walk a wizard)'), clearly distinguishing this from single-action siblings like scout_click and scout_type. It names the resource and action explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: for mechanical sequences to avoid round-trip cost. It does not explicitly name alternatives or state when not to use it, but the context makes it clear that individual single actions belong to the sibling tools. This is strong guidance but lacks formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_scanA
Scan a project directory to discover the frontend workspace, framework, routes, dev command, Playwright auth storage states, and testid conventions. Run this first.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | Yes | Absolute path to the project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It conveys a read-only reconnaissance behavior by saying 'scan a project directory to discover...' but does not mention whether state is persisted, what the return shape looks like, or if any environmental prerequisites exist. This leaves some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence plus the useful sequencing directive 'Run this first.' It frontloads the action and follows with a concrete list of discovery targets, containing no filler or redundant repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no annotations and no output schema, the description provides the essential call context: what to pass, what will be discovered, and that it should be invoked first. It does not explicitly describe the return format, but the enumerated discovery targets partially compensate and make the tool callable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, projectPath, is already fully documented in the schema as 'Absolute path to the project root,' and the description adds no additional constraints, defaults, or format details. The discovered artifacts listed in the description concern tool output rather than parameter semantics, so the schema remains the primary source of parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('scan') and object ('project directory') and enumerates the concrete artifacts it uncovers: frontend workspace, framework, routes, dev command, Playwright auth storage states, and testid conventions. This makes its role as a project discovery tool unmistakable and distinguishes it from execution-oriented siblings. The directive 'Run this first' also makes its purpose immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to run this tool first, establishing clear sequencing relative to the many scout_* sibling tools. It does not name specific alternatives or conditions for choosing another tool, but the 'first' directive gives the agent enough contextual guidance for initial invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_screenshotA
Take a JPEG screenshot of the current viewport. LAST RESORT: geometry issues are in scout_snapshot and style/contrast/spacing issues are in scout_design_audit — images that failed to load are listed in scout_snapshot under BROKEN IMAGES — use a screenshot only for pixel-native content (a canvas, visual gestalt) that computed data cannot capture.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden, and it does well by disclosing the JPEG format, viewport scope, and the 'LAST RESORT' nature of the tool. It could be slightly more explicit about side effects or what the caller receives, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one dense, front-loaded sentence with no filler. It packs the main action first and the routing caveats after, though the long em-dash chain is slightly less scannable than a short two-sentence structure would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for selecting and invoking the tool: it says what is captured, in what format, and when not to use it. With no output schema, it slightly underspecifies the result format or delivery mechanism, but that is a minor gap for a simple screenshot tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the sole optional `session` parameter is fully documented in the schema. The description adds no parameter-specific detail, but none is required beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Take a JPEG screenshot of the current viewport.' It also clearly distinguishes itself from siblings by naming what belongs in scout_snapshot and scout_design_audit instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
This is exemplary routing guidance. It tells the agent to use this tool only for pixel-native content that computed data cannot capture, and explicitly directs geometry issues to scout_snapshot, style/contrast/spacing issues to scout_design_audit, and broken-image checks to the BROKEN IMAGES section of scout_snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_scrollA
Scroll like a user — real apps hide their bugs below the fold. Reports the resulting position (px and %), and explicitly flags SCROLL LOCKED: scrollable content exists but the page will not move (the classic leaked modal scroll-lock that silently cuts users off from everything below the fold — snapshots also detect this passively as an OVERLAY line). Without target it scrolls the page, falling back to the largest scrollable pane on app-shell layouts. Pass target to scroll ONE region instead (a sidebar nav, a dialog body, a table pane): the page-level pick is the LARGEST scroll port, so a smaller region beside it never moves and its content looks truncated when it is only scrolled away — never call a nav item missing without scrolling its own container first. Use before judging a long page: the design audit measures at the current scroll position, so scroll + re-snapshot/re-audit deep sections; scroll also triggers lazy-loaded content whose failures then surface as oracle violations.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | Scroll by px instead (positive = down). Default 600 when neither given. | |
| to | No | Jump to an edge | |
| target | No | Scroll ONE region instead of the page: "testid=…", "text=…" or "label=…". Scrolls that element's nearest scrollable ancestor. | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it is unusually rich: it discloses the fallback to the largest scrollable pane on app-shell layouts, that smaller regions beside it never move, that it reports SCROLL LOCKED, and that scrolling triggers lazy-loaded content. This goes well beyond what the schema alone reveals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, but nearly every clause carries behavioral or workflow value, and it is front-loaded with the core action. Some rhetorical framing ('real apps hide their bugs below the fold') could be trimmed, and the parenthetical caveats make it a wall of text rather than a scannable definition, but it is efficient for the complexity it documents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 optional parameters, no output schema, and no annotations, the description covers the essential missing context: result format (px and %), SCROLL LOCKED detection, fallback behavior, target-region semantics, and why scrolling matters for audits and lazy-loaded content. The schema handles the remaining parameter details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value on top by explaining the target semantics in depth — single region, nearest scrollable ancestor, and the 'smaller region beside it' trap. It does not redundantly restate by/to/session, leaving the schema to cover those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific behavior ('Scroll like a user'), the resource acted on (page or one target region), and the outcome (reports position in px and %, flags SCROLL LOCKED when scroll is blocked). It clearly differentiates itself from sibling tools like scout_snapshot and scout_design_audit by being the scroll-position-changing action that precedes them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow guidance: use before judging a long page, then re-snapshot/re-audit deep sections, because the design audit measures at the current scroll position. It also warns against calling a nav item missing without scrolling its own container first, which is a concrete when-to-use versus when-to-target instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_selectB
Select an option in a by ref.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| value | Yes | Option value or label | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral transparency burden. It only says 'Select an option in a <select> by ref' and does not disclose whether the action triggers change events, waits for navigation, requires visibility, or what happens when the value/label is not found. These are meaningful gaps for an interaction tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler and the core action is front-loaded. It loses a point only because the brevity edges into under-specification, particularly around the meaning of 'ref'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and a minimally described ref parameter, the description is not complete enough. An agent would still need to infer where ref comes from, what 'value' matching entails, and what side effects or errors to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, with value and session already documented. The description adds some interpretive value by indicating that ref is a reference to the select element, but it does not explain how ref is obtained or formatted, leaving the most opaque parameter only partially clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Select') and a specific resource ('an option in a <select>'), refined by 'by ref'. This makes the tool's core purpose clear and distinguishable from names like scout_click, though it does not explicitly name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: whenever an option needs to be selected in a <select> element. However, it gives no exclusions, no guidance on how it compares to sibling tools like scout_click, and no mention of when the session parameter should be used, which lives only in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_sessionA
List live sessions, or set which one is the DEFAULT (used by any tool call that omits session). Prefer passing session directly on each tool call for multi-role work — that's what lets concurrent dispatch happen; scout_session is for sequential convenience (skip repeating session on every call) and for checking what's live. Both browsers stay live and authenticated regardless of which is default — re-snapshot a session after a break to see what changed while it was away.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Session to make the default; omit to list sessions | |
| session | No | Alias for `name`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden. It discloses that both browsers remain live and authenticated regardless of default choice, and that re-snapshotting after a break reveals changes. This adds meaningful state-lifecycle context beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, and every sentence earns its place: the first states purpose, the second gives usage guidance, the third clarifies persistent browser state. No filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only two simple parameters, no annotations, and no output schema, the description covers purpose, default behavior, concurrency trade-offs, and persistence of browser sessions. It does not spell out return format or conflict behavior if both `name` and `session` are supplied, but these are minor for this tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra meaning by explaining the default selection applies to any tool call that omits `session`, and why that matters for concurrent dispatch. This goes beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List live sessions, or set which one is the DEFAULT.' It clearly distinguishes this tool from the broader scout_* family by centering on session default management and live-session listing, so an agent can tell what it does without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage direction: prefer passing `session` directly for multi-role/concurrent work, and use scout_session for sequential convenience and checking live sessions. This is exactly the when-to-use versus when-not-to-use guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_snapshotA
Capture the current page state: URL, state fingerprint, interactable elements with refs (e1, e2, …), geometry issues, coverage, and oracle violations since the last action. Re-snapshotting the same route returns a DIFF (refs stay stable). Cheap — prefer this over screenshots.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Force a full element list instead of a diff | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It clearly discloses the diff behavior, stable refs, cheapness, and the 'since the last action' scope. It does not explicitly state whether the operation is read-only or discuss failure modes, but 'capture' implies non-mutation and the disclosed traits cover the most important behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the primary purpose stated in the first sentence and useful behavioral details following. Each sentence adds distinct value—purpose, diff behavior, and cost/alternative—with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the snapshot contains, the diff behavior, the temporal scope ('since the last action'), and the important recommendation against screenshots. No output schema is present, so the listed content items serve as a sufficient description of what the agent will receive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents both parameters in detail, including the full-diff toggle and session targeting semantics. The description itself adds no parameter-level meaning, which is acceptable given the schema's thoroughness; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a strong verb and resource: 'Capture the current page state' and lists concrete outputs (URL, state fingerprint, interactable elements, refs, geometry issues, coverage, oracle violations). It also distinguishes itself from the screenshot sibling by stating it is cheaper and preferred, making the tool's identity clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to prefer this over screenshots and explains that re-snapshotting the same route returns a diff, which guides when to call it again. It does not enumerate exclusions relative to other scout_* siblings, but the guidance it gives is actionable and sufficient for the main decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_typeA
Type into a text input/textarea/composer by ref, the way a real user does: if the field already holds content (e.g. an @-mention chip a menu click inserted), the text is APPENDED at the end — preserving that content — and the result reports what was already there (a separating space is added only at a word-to-word boundary). Pass replace=true to clear the field first (correcting a previous entry); an empty textValue always clears. Appending fires input events but not keydown, so keydown-driven triggers (slash/mention menus) will not react to appended text. Use for both valid values and boundary/fuzz values (empty, very long, unicode, script tags).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref, e.g. e12 | |
| value | No | Alias for `textValue`. | |
| replace | No | Clear the field before typing instead of appending to existing content | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. | |
| textValue | No | Text to type | |
| pressEnter | No | Press Enter after typing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses append-with-preservation behavior, separating-space logic, replace/clear semantics, the fact that input events fire but keydown does not, and edge-case handling for empty values. This is far beyond minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but purposeful, with behavioral facts and edge cases packed into a compact block. It is somewhat long and could be broken into clearer sentences, but every sentence earns its place by adding operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, no annotations, and no output schema, the description is remarkably complete. It covers core behavior, parameter-level semantics, event caveats, replace/clear logic, and boundary-value use cases. The only minor omission is the exact result format, but the description does mention what the result reports.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: it explains what appending does to existing content, when replace is appropriate, and that empty textValue clears. This enriches the raw parameter definitions with behavioral context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Type'), resource ('text input/textarea/composer'), and method ('by ref'). It also clarifies the core behavioral distinction between appending and replacing, making it easy to tell apart from sibling input tools like scout_click or scout_press.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains when to use replace=true vs default appending, notes that empty textValue clears the field, and gives an explicit use case ('valid values and boundary/fuzz values'). It also warns that keydown-driven menus won't react to appended text, which helps an agent decide between this tool and alternatives. It does not explicitly name alternative sibling tools, but the guidance is otherwise strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scout_uploadA
Attach a file to an upload control the way a user does. ref is either a visible (snapshots list these with role file) or the button/label/dropzone that opens the file chooser — the chooser is intercepted and answered, which is how the hidden input behind a styled 'Choose file' control is reached. Omit ref to target the page's only file input, hidden or not (snapshots disclose hidden ones on a FILE INPUTS line). Nothing needs to exist on disk: a small VALID fixture (real PDF/PNG structure) is generated in memory, its kind inferred from the input's accept attribute or chosen with fixture; filePath uploads a real file but must live inside the attached project (fenced like navigation is fenced to the origin); name overrides the filename for boundary tests (wrong extension vs accept, very long, unicode). The result names the input, how the file reached it, flags a file that violates accept (a mismatch the app then accepts is a validation finding), warns if the app cleared the input after selection, and says whether a state-changing request fired on selection — if none did, click the form's submit, or check the next snapshot for a client-side rejection.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref of the file input OR of the control that opens the file chooser; omit when the page has exactly one file input | |
| name | No | Filename override (default scenescout-fixture.<kind>, or the disk file's own name) | |
| fixture | No | Generated fixture kind; default: inferred from the input's accept attribute (pdf when there is none, or none we can generate) | |
| session | No | Target this session directly instead of the active one — pass it explicitly when dispatching to MULTIPLE sessions in one turn (e.g. two scout_click calls with different `session`), which then run CONCURRENTLY rather than queueing. Omit for single-session sequential use. | |
| filePath | No | A real file to upload — absolute or relative to the project; must be inside the attached project. Exclusive with fixture. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers thoroughly. It explains the interception of the file chooser, the generation of valid fixtures in memory, the fencing of filePath to the project, and the detailed result content (input name, violation flags, cleared-input warning, state-changing request detection). It also hints at side effects (state-changing requests) and provides follow-up guidance, making behavior fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core action, but it is a single long paragraph without section breaks. Every sentence adds value, and the structure flows from purpose to parameters to result, so it is well-organized. It could be slightly more scannable with bullet points, but the content justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the absence of an output schema, and no annotations, the description is remarkably complete. It explains the return value in detail (input name, method, accept violations, cleared-input warning, state-change detection) and offers concrete next steps. It also covers edge cases like hidden inputs, multiple sessions, and fixture types. Nothing essential for an agent to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds substantial meaning beyond the schema. For `ref`, it explains the two acceptable target types and the hidden-input scenario. For `fixture`, it clarifies the inference logic and default. For `filePath`, it adds the project-fencing constraint. For `name`, it explains boundary-test use cases. This is far beyond the schema's terse descriptions, so it deserves a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb and resource: 'Attach a file to an upload control the way a user does.' It immediately distinguishes the tool from siblings like scout_click or scout_type by describing the upload interaction and the mechanism for reaching hidden inputs. The purpose is unambiguous and not a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides rich usage context: when to omit `ref`, when to use `fixture` vs `filePath`, how to target hidden inputs, and what to do after upload (click submit if no state-changing request). It does not explicitly name alternative tools for exclusion, but the guidance is clear enough to select this tool for uploads. A small gap is the lack of an explicit 'use this instead of X' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.2.0- Changed
scout_attach1 field changed- added
Input schema / properties / browserAdded value: +{ + "description": "Browser to drive. Default: the SCENESCOUT_BROWSER environment variable, else chromium. firefox and webkit must be downloaded first (scenescout install --browser-only --browsers firefox). Use them for a cross-browser pass; stay on chromium otherwise.", + "enum": [ + "chromium", + "firefox", + "webkit" + ], + "type": "string" +}
- Added
scout_playbook
48 tool updates
v1.1.0- Removed
ft_attach - Removed
ft_back - Removed
ft_click - Removed
ft_close - Removed
ft_coverage - Removed
ft_crawl - Removed
ft_design_audit - Removed
ft_finding - Removed
ft_hover - Removed
ft_journey - Removed
ft_navigate - Removed
ft_note - Removed
ft_press - Removed
ft_report - Removed
ft_resolve - Removed
ft_run_plan - Removed
ft_scan - Removed
ft_screenshot - Removed
ft_scroll - Removed
ft_select - Removed
ft_session - Removed
ft_snapshot - Removed
ft_type - Removed
ft_upload - Added
scout_attach - Added
scout_back - Added
scout_click - Added
scout_close - Added
scout_coverage - Added
scout_crawl - Added
scout_design_audit - Added
scout_finding - Added
scout_hover - Added
scout_journey - Added
scout_navigate - Added
scout_note - Added
scout_press - Added
scout_report - Added
scout_resolve - Added
scout_run_plan - Added
scout_scan - Added
scout_screenshot - Added
scout_scroll - Added
scout_select - Added
scout_session - Added
scout_snapshot - Added
scout_type - Added
scout_upload
24 tool updates
v0.23.3- First observed
ft_attach - First observed
ft_back - First observed
ft_click - First observed
ft_close - First observed
ft_coverage - First observed
ft_crawl - First observed
ft_design_audit - First observed
ft_finding - First observed
ft_hover - First observed
ft_journey - First observed
ft_navigate - First observed
ft_note - First observed
ft_press - First observed
ft_report - First observed
ft_resolve - First observed
ft_run_plan - First observed
ft_scan - First observed
ft_screenshot - First observed
ft_scroll - First observed
ft_select - First observed
ft_session - First observed
ft_snapshot - First observed
ft_type - First observed
ft_upload
TDQS
Scored across 25 tools
Every tool maps to a distinct phase or primitive: exploration, interaction, observation, memory, or reporting. Close pairs like snapshot/screenshot/design_audit are explicitly separated by what they capture, and run_plan vs individual action tools is clearly scoped by semantic locators vs snapshot refs.
All tools share the scout_ prefix and lowercase snake_case, making the family instantly recognizable. However, the suffix convention is mixed: bare verbs (scout_click, scout_type), nouns (scout_snapshot, scout_report), and multi-word phrases (scout_design_audit, scout_run_plan) are all present, so the pattern is readable but not a uniform verb_noun scheme.
25 tools is at the high end of the range and feels heavy for a single server, even though most tools have distinct responsibilities. Some action primitives could plausibly be consolidated, such as navigate/back or press versus other keyboard handling, making this a comprehensive but slightly bloated surface.
The tool surface covers the full scouting lifecycle: project discovery, session/authentication, navigation, interaction, crawling, snapshotting, design audit, journey measurement, finding capture/resolution, persistent notes, coverage tracking, and gated reporting. There are no obvious dead ends; gaps like waiting or custom assertions are handled by snapshot diffs, oracle violations, and run_plan semantics.
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for visual regression testing: triage a PR's UI diffs from your coding agent.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceA Playwright-based MCP server that exposes a live browser as a traceable, inspectable, debuggable and controllable execution environment for AI agents.3,661 npm57-
- AlicenseNot gradedqualityCmaintenanceAn MCP server that gives AI agents real browser capabilities including screenshotting, action execution, data extraction, and multi-persona auditing for frontend validation.23 npm6MIT
- AlicenseCqualityAmaintenanceAn MCP server that enables AI agents to autonomously test, debug, and analyze web interfaces visually using Playwright, with 30 tools for screenshots, workflows, performance, and visual comparison.3013 npm83ISC
- FlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents to automate browser testing via Chromium, providing tools for navigation, interaction, and inspection.-