The SDK to extract data and interact with any site on the web. Get started with Claude Code, Codex, Eve, Mastra, and more.
This report summarizes scanner evidence for browserbase/stagehand, a TypeScript project with 25,885 GitHub stars. SynthScan examined 311,449 lines of code across 1479 source files, recording 1165 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 4.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 857 finding(s).
Are imports declared and package/API names verified? 220 finding(s).
Are wrappers, guards, and repeated structures necessary? 899 finding(s).
Which changes need focused human review? 1165 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1165 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/release/python-version.ts | 11 | function locatePythonProjectVersion(contents: string): VersionLocation { | CODE |
| LOW | scripts/release/python-version.ts | 36 | export function updatePythonProjectVersion(contents: string, nextVersion: string): string { | CODE |
| LOW | scripts/release/preview-python-project.ts | 8 | export function parsePreviewPythonProject(contents: string): PreviewPythonProject { | CODE |
| LOW | scripts/release/preview-python-project.ts | 16 | export function updatePreviewPythonProjectVersion(contents: string, version: string): string { | CODE |
| LOW | scripts/release/scoped-release.ts | 53 | export async function assertPublishedCliDependencies( | CODE |
| LOW | scripts/release/consolidate-changelogs.ts | 95 | export async function cleanupGeneratedChangelogs( | CODE |
| LOW | scripts/release/consolidate-changelogs.ts | 108 | export function shouldPreservePackageChangelogs(value: string | undefined): boolean { | CODE |
| LOW | scripts/release/consolidate-changelogs.ts | 112 | async function checkPackageChangelogsAreTemporary(): Promise<void> { | CODE |
| LOW | packages/sdk-python/tests/test_response.py | 25 | def test_response_exposes_immediate_metadata_with_defensive_header_copies() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_response.py | 42 | async def test_response_retrieves_headers_and_connection_metadata_lazily() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_response.py | 100 | async def test_response_decodes_body_text_and_json_through_independent_rpc_calls() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_response.py | 120 | async def test_response_surfaces_finished_failures_transport_errors_and_malformed_bodies() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_response.py | 147 | async def test_response_finished_returns_none_after_success() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 139 | def test_stagehand_constructor_is_private() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 144 | def test_stagehand_does_not_expose_context() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 161 | async def test_experimental_batch_validates_arguments_before_transport( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 185 | async def test_experimental_batch_uses_registered_rpc_method( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 211 | async def test_experimental_batch_normalizes_json_object_keys( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 229 | async def test_experimental_batch_distinguishes_omitted_input_from_null( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 253 | async def test_experimental_batch_accepts_maximum_timeout( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 273 | async def test_experimental_batch_includes_an_explicit_page( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 295 | async def test_experimental_batch_maps_an_omitted_value_to_none( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 309 | async def test_create_requires_a_factory_browser_before_validating_config() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 318 | async def test_create_builds_client_browserbase_wire_params( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 369 | async def test_create_sends_the_extension_its_own_cdp_url( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 390 | async def test_local_connect_keeps_headers_out_of_extension_initialization( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 448 | async def test_create_omits_unset_browser_region_from_the_wire( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 467 | async def test_local_browser_omits_metadata_and_forwards_caller_options( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 509 | async def test_create_rejects_model_connection_options_for_missing_or_callback_models( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 523 | async def test_create_claim_errors_for_closed_and_attached_handles( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 541 | async def test_failed_create_releases_claim_and_keeps_browser_open_for_retry( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 567 | async def test_context_close_is_an_alias_for_browser_close( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 587 | async def test_invalid_success_response_fails_closed_because_initialization_is_ambiguous( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 606 | async def test_ambiguous_initialization_uses_browser_invalidation_not_public_close( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 645 | async def test_cancelled_create_fails_closed_and_prevents_same_browser_retry( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 700 | async def test_create_deadline_fails_closed_without_a_flaky_five_millisecond_timer( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 754 | async def test_failed_create_for_missing_cdp_url_can_retry_same_handle( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 772 | async def test_close_is_memoized_and_never_closes_browser_or_transport( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 807 | async def test_close_works_with_eager_task_factory( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 830 | async def test_close_swallows_cdp_connection_closed_error( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 850 | async def test_close_failure_retains_browser_claim( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 868 | async def test_stagehand_prints_logs_and_calls_structured_callback( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 905 | async def test_callback_llm_handler_preserves_structured_and_image_content( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 954 | async def test_stagehand_routes_metrics_and_ai_methods( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1071 | async def test_stagehand_observe_and_extract_serialize_active_page_locators( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1140 | async def test_stagehand_act_observe_and_extract_reject_cross_page_locators( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1165 | async def test_stagehand_extract_uses_default_schema( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1210 | async def test_stagehand_ai_methods_require_an_active_page( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1230 | def test_semantic_arguments_stay_positional(method: str, positional: list[str]) -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1255 | async def test_create_validates_api_url_before_claiming_browser( | CODE |
| LOW | packages/sdk-python/tests/test_browser_context.py | 21 | async def test_browser_context_wraps_generated_page_references() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_browser_context.py | 48 | async def test_browser_context_new_page_validates_optional_url() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_browser_context.py | 61 | def test_browser_context_reuses_one_clipboard_wrapper() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_browser_context.py | 68 | async def test_browser_context_serializes_python_cookie_filters() -> None: | CODE |
| LOW | …kages/sdk-python/tests/test_page_event_notification.py | 12 | def test_page_event_notification_round_trip(event: str) -> None: | CODE |
| LOW | packages/sdk-python/tests/test_browserbase_transport.py | 142 | async def test_shared_gateway_headers(upstream: _Upstream, fixture: dict[str, object]) -> None: | CODE |
| LOW | packages/sdk-python/tests/test_browserbase_transport.py | 157 | async def test_shared_request_header_rules( | CODE |
| LOW | packages/sdk-python/tests/test_browserbase_transport.py | 192 | async def test_custom_headers_and_reserved_precedence( | CODE |
| LOW | packages/sdk-python/tests/test_browserbase_transport.py | 216 | async def test_http_failures_are_returned_without_retries( | CODE |
| LOW | packages/sdk-python/tests/test_browserbase_transport.py | 237 | async def test_response_header_bytes_and_duplicates(upstream: _Upstream) -> None: | CODE |
| 740 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 358 | return (await this.sdk.stagehand.browser.context.pages()).map((page) => this.wrap(page)); | CODE |
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 362 | const page = await this.sdk.stagehand.browser.context.activePage(); | CODE |
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 364 | const pages = await this.sdk.stagehand.browser.context.pages(); | CODE |
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 370 | return this.wrap(await this.sdk.stagehand.browser.context.newPage(url)); | CODE |
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 374 | const page = (await this.sdk.stagehand.browser.context.pages()).find( | CODE |
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 378 | await this.sdk.stagehand.browser.context.setActivePage(page); | CODE |
| CRITICAL⚡ | packages/evals/core/tools/stagehand_code.ts | 382 | const page = (await this.sdk.stagehand.browser.context.pages()).find( | CODE |
| CRITICAL | packages/extension/clients/rpcClient.ts | 80 | const span = this.router.runtime.tracing.tracer.startSpan( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/tests/test_response.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browser_context.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browserbase_transport.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/_support.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_locator.py | 1 | CODE | |
| LOW | …ages/sdk-python/tests/test_browserbase_routing_live.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/_http_server.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browser_clipboard.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browserbase_services.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browserbase_rpc.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browser.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_client_models.py | 1 | CODE | |
| LOW | …kages/sdk-python/tests/test_browser_disconnect_live.py | 1 | CODE | |
| LOW | …ckages/sdk-python/tests/test_browserbase_connection.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browserbase_session.py | 1 | CODE | |
| LOW | packages/sdk-python/scripts/build.py | 1 | CODE | |
| LOW | packages/sdk-python/scripts/generate.py | 1 | CODE | |
| LOW | packages/sdk-python/scripts/smoke.py | 1 | CODE | |
| LOW | …ges/sdk-python/src/stagehand/browserbase_connection.py | 1 | CODE | |
| LOW | …kages/sdk-python/src/stagehand/browserbase_services.py | 1 | CODE | |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 1 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browserbase_rpc.py | 1 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 3 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 6 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 20 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 24 | CODE | |
| 85 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/evals/tui/commands/help.ts | 16 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 46 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 168 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 186 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 206 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 267 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 297 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 319 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 335 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 350 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 371 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 402 | print([ | CODE |
| HIGH⚡ | packages/evals/tui/commands/run.ts | 218 | print(`\n ${bold("Running:")} ${cyan(buildRunTargetLabel(options))}`); | CODE |
| HIGH⚡ | packages/evals/tui/commands/run.ts | 219 | print(` ${bold("Plan:")} ${buildPlanLine(options, matrix)}`); | CODE |
| HIGH⚡ | packages/evals/tui/commands/run.ts | 220 | print(` ${buildRunContextLine(options, tasks, matrix)}`); | CODE |
| HIGH⚡ | packages/evals/tui/commands/run.ts | 222 | print(separator()); | CODE |
| HIGH⚡ | packages/evals/tui/commands/run.ts | 223 | print(""); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/evals/tui/wizardAnim.ts | 46 | // ─── Color ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/wizardAnim.ts | 109 | // ─── Layout ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/wizardAnim.ts | 194 | // ─── Reveal cadences ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/wizardAnim.ts | 285 | // ─── Input ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/wizardAnim.ts | 417 | // ─── Decoded keys ─────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/fx.ts | 16 | // ─── Palette ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/fx.ts | 77 | // ─── Easing ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/fx.ts | 92 | // ─── Canvas ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/fx.ts | 180 | // ─── Frame loop ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/fx.ts | 215 | // ─── Randomness ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/progress.ts | 181 | // ─── Events ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/progress.ts | 375 | // ─── Board ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/progress.ts | 502 | // ─── Rendering ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/repl.ts | 68 | // ─── Onboarding chrome ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/arena.ts | 172 | // ─── Drawing helpers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/arena.ts | 220 | // ─── Race ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/arena.ts | 326 | // ─── Podium ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/arena.ts | 417 | // ─── Flow ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/intro.ts | 40 | // ─── Content ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/intro.ts | 50 | // ─── Track (rows, at rest) and timeline (ms) ──────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/intro.ts | 76 | // ─── Drawing ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/intro.ts | 177 | // ─── Player ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/dialogue.ts | 31 | // ─── Layout ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/dialogue.ts | 190 | // ─── Motion ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/dialogue.ts | 339 | // ─── Transcript ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/welcome/dialogue.ts | 416 | // ─── Flow ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/commands/verify.ts | 141 | // ── Build a verifier without launching a browser ──────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/commands/verify.ts | 209 | // ── Human summary ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/commands/verify.ts | 251 | // ── Persist ──────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/sdk-python/tests/_http_server.py | 41 | except (ConnectionError, asyncio.IncompleteReadError): | CODE |
| HIGH | packages/sdk-python/src/stagehand/cdp_client.py | 865 | except Exception: | CODE |
| HIGH | packages/sdk-python/src/stagehand/browser.py | 1110 | except TimeoutError: | CODE |
| HIGH | packages/sdk-python/src/stagehand/browser.py | 522 | except CDPConnectionClosedError: | CODE |
| HIGH | …ckages/sdk-python/src/stagehand/browserbase_session.py | 303 | except Exception: | CODE |
| HIGH | …ckages/sdk-python/src/stagehand/browserbase_session.py | 314 | except Exception: | CODE |
| HIGH | packages/sdk-python/src/stagehand/file_upload.py | 60 | except OSError: | CODE |
| HIGH | packages/integrations/deepagents/runner/run_eval.py | 89 | except Exception: # noqa: BLE001 | CODE |
| HIGH | packages/integrations/deepagents/runner/run_eval.py | 735 | except Exception: # noqa: BLE001 | CODE |
| HIGH | …integrations/deepagents/runner/tests/test_watchdogs.py | 190 | except GeneratorExit: | CODE |
| HIGH | …rations/deepagents/examples/managed/tools/stagehand.py | 231 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/tests/test_stagehand.py | 386 | "headers", [None, {}, {"Authorization": "Bearer dummy-secret", "X-Api-Key": "dummy-key"}] | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 438 | for sensitive in ("Authorization", "X-Api-Key", "dummy-secret", "dummy-key"): | CODE |
| LOW | packages/sdk-python/tests/test_cdp_headers.py | 36 | credentials = {"Authorization": "Bearer dummy", "X-Api-Key": "dummy-key"} | CODE |
| LOW | packages/sdk-python/tests/test_cdp_headers.py | 61 | for sensitive in ("Bearer dummy", "dummy-key", "Authorization", "X-Api-Key", destination): | CODE |
| LOW | packages/extension/tests/observe.test.ts | 24 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/observe.test.ts | 60 | expect(request?.systemPrompt).not.toContain("user@example.com"); | CODE |
| LOW | packages/extension/tests/observe.test.ts | 138 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/act.test.ts | 121 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/act.test.ts | 141 | ["user@example.com"], | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2483 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2491 | expect(page.locatorRefs[0]?.fillCalls).toStrictEqual(["user@example.com"]); | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2555 | inputValue: "user@example.com", | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2570 | await expect(runtime.locatorInputValue(descriptor)).resolves.toBe("user@example.com"); | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2702 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2715 | expect(page.locatorRefs[0]?.fillCalls).toStrictEqual(["user@example.com"]); | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 294 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 307 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 327 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 340 | value: "user@example.com", | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 243 | value: "user@example.com", | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 257 | value: "user@example.com", | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 292 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 300 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 457 | expect(StagehandMethods.locatorInputValue.result.parse("user@example.com")).toBe( | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 458 | "user@example.com", | CODE |
| LOW | packages/cli/tests/driver-commands.test.ts | 229 | value: "user@example.com", | CODE |
| LOW | packages/cli/tests/driver-commands.test.ts | 236 | expect(locator.fill).toHaveBeenCalledWith("user@example.com"); | CODE |
| LOW | packages/integrations/core/tests/facade-tools.test.ts | 1154 | const filled = world.locators.find((l) => l.selector.includes("placeholder")); | CODE |
| LOW | packages/integrations/core/tests/facade-tools.test.ts | 1371 | tools.run(`await page.frameLocator("#editor").locator("input").getAttribute("placeholder");`), | CODE |
| LOW | packages/integrations/core/src/facade/runtime.ts | 1223 | return this.byAttribute("placeholder", value, options.exact); | CODE |
| LOW | packages/integrations/core/src/facade/runtime.ts | 1951 | name: "placeholder", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1498 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1524 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1599 | value: "user@example.com", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1624 | value: "user@example.com", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1896 | await page.locator("#email").fill("user@example.com"); | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1902 | value: "user@example.com", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1939 | client.queueResponse(StagehandMethods.locatorInputValue, "user@example.com"); | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1948 | await expect(locator.inputValue()).resolves.toBe("user@example.com"); | CODE |
| LOW | packages/sdk-ts/tests/clientLocatorOptions.test.ts | 27 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | packages/sdk-ts/tests/clientLocatorOptions.test.ts | 35 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | …ts/browser-runtime/stagehandLaunchConnectSmoke.test.ts | 186 | await page.locator("#locator-input").fill("user@example.com"); | CODE |
| LOW | …ts/browser-runtime/stagehandLaunchConnectSmoke.test.ts | 191 | await expect(page.locator("#locator-input").inputValue()).resolves.toBe("user@example.com"); | CODE |
| LOW | …/tests/browser-runtime/rpcClientExtensionSmoke.test.ts | 336 | value: "user@example.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 551 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 556 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 748 | except Exception: | CODE |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 865 | except Exception: | CODE |
| MEDIUM | packages/sdk-python/src/stagehand/cdp_client.py | 546 | def _read(self) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/browserbase_rpc.py | 90 | except Exception: | CODE |
| LOW | packages/sdk-python/src/stagehand/page.py | 465 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/page.py | 499 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/browser.py | 1058 | except Exception: | CODE |
| LOW | packages/sdk-python/src/stagehand/rpc_client.py | 394 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/rpc_client.py | 505 | except Exception as error: | CODE |
| MEDIUM | packages/sdk-python/src/stagehand/rpc_client.py | 388 | def _read(self) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 545 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 186 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 195 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 223 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 275 | except Exception: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 303 | except Exception: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 314 | except Exception: | CODE |
| LOW | …ges/integrations/core/python/tests/test_conformance.py | 282 | except Exception as error: | CODE |
| LOW | …s/core/python/src/stagehand_middleware/facade/tools.py | 266 | except Exception as error: | CODE |
| LOW | …s/core/python/src/stagehand_middleware/facade/tools.py | 272 | except Exception as close_error: | CODE |
| LOW | …s/core/python/src/stagehand_middleware/facade/tools.py | 289 | except Exception as error: | CODE |
| LOW | …s/core/python/src/stagehand_middleware/facade/tools.py | 424 | except Exception: | CODE |
| LOW | …s/core/python/src/stagehand_middleware/facade/tools.py | 432 | except Exception: | CODE |
| LOW | packages/integrations/deepagents/runner/run_eval.py | 89 | except Exception: # noqa: BLE001 | CODE |
| LOW | packages/integrations/deepagents/runner/run_eval.py | 723 | except Exception as error: # noqa: BLE001 | CODE |
| LOW | packages/integrations/deepagents/runner/run_eval.py | 735 | except Exception: # noqa: BLE001 | CODE |
| LOW | …integrations/deepagents/runner/tests/test_watchdogs.py | 135 | except Exception as error: | CODE |
| LOW | …integrations/deepagents/runner/tests/test_watchdogs.py | 194 | except Exception as error: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 41 | except Exception as error: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 205 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 231 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 240 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 278 | except Exception as error: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 288 | except Exception as error: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 303 | except Exception as error: | CODE |
| LOW | …grations/deepagents/src/stagehand_deepagents/server.py | 55 | except Exception as error: | CODE |
| LOW | …grations/deepagents/src/stagehand_deepagents/server.py | 149 | except Exception as error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/sdk-python/examples/file_upload.py | 24 | return file ? { name: file.name, text: await file.text() } : null; | CODE |
| HIGH | packages/sdk-python/src/stagehand/cdp_client.py | 35 | marker: globalThis.__stagehand_runtime ?? null, | CODE |
| HIGH⚡ | packages/integrations/core/python/tests/test_facade.py | 41 | assert canonical_json(value) == '{"a":true,"b":[1,{"c":null,"d":"\u2014\\n\\u0001"}]}' | CODE |
| HIGH⚡ | packages/integrations/core/python/tests/test_facade.py | 315 | ({"a": [1, None]}, len('{"a":[1,null]}')), | CODE |
| HIGH⚡ | packages/integrations/core/python/tests/test_browser.py | 128 | await tools.run(code=f"await page.goto({mutating_page(1200)!r}); return null;") | CODE |
| HIGH⚡ | packages/integrations/core/python/tests/test_browser.py | 138 | await tools.run(code=f"await page.goto({mutating_page(None)!r}); return null;") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ages/sdk-python/tests/test_browserbase_routing_live.py | 74 | CODE | |
| LOW | packages/sdk-python/tests/test_client_lifecycle_live.py | 42 | CODE | |
| LOW | packages/sdk-python/examples/custom_logging.py | 11 | CODE | |
| LOW | packages/sdk-python/examples/file_upload.py | 8 | CODE | |
| LOW | packages/sdk-python/scripts/smoke.py | 62 | CODE | |
| LOW | packages/sdk-python/scripts/smoke.py | 112 | CODE | |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 266 | CODE | |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 678 | CODE | |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 727 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 442 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 938 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 1012 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 513 | CODE | |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/file_upload.py | 33 | CODE | |
| LOW | …ges/integrations/core/python/tests/test_conformance.py | 209 | CODE | |
| LOW | …ges/integrations/core/python/tests/test_conformance.py | 230 | CODE | |
| LOW | …s/core/python/src/stagehand_middleware/facade/tools.py | 327 | CODE | |
| LOW | packages/integrations/deepagents/runner/run_eval.py | 223 | CODE | |
| LOW | packages/integrations/deepagents/runner/run_eval.py | 546 | CODE | |
| LOW | …integrations/deepagents/runner/tests/test_watchdogs.py | 170 | CODE | |
| LOW | …integrations/deepagents/runner/tests/test_watchdogs.py | 177 | CODE | |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 183 | CODE | |
| LOW | …grations/deepagents/src/stagehand_deepagents/server.py | 140 | CODE | |
| LOW | …es/examples/cookbooks/paginated-catalog/python/main.py | 45 | CODE | |
| LOW | …ages/examples/cookbooks/persisted-login/python/main.py | 13 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 266 | CODE | |
| LOW | packages/sdk-python/src/stagehand/page.py | 614 | CODE | |
| LOW | packages/sdk-python/src/stagehand/page.py | 665 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 576 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 777 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 120 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 345 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 386 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 347 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 389 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 418 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/core/python/src/stagehand_middleware/facade/tools.py | 61 | # sanitizeErrorMessage in src/harness/redact.ts. JavaScript regexes without the | COMMENT |
| MEDIUM | packages/integrations/deepagents/runner/run_eval.py | 49 | # waits on the child's exit indefinitely and the eval harness freezes. All are | COMMENT |
| MEDIUM⚡ | …/integrations/deepagents/runner/tests/test_run_eval.py | 558 | # deepagents must still derive its harness profile key from the prebuilt model. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 1226 | - [#586](https://github.com/browserbase/stagehand/pull/586) [`c57dc19`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | CHANGELOG.md | 1226 | - [#586](https://github.com/browserbase/stagehand/pull/586) [`c57dc19`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | CHANGELOG.md | 1393 | - [#373](https://github.com/browserbase/stagehand/pull/373) [`ff00965`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | CHANGELOG.md | 1393 | - [#373](https://github.com/browserbase/stagehand/pull/373) [`ff00965`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | packages/cli/README.md | 260 | browse functions init my-function # scaffold a new project (--package-manager) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/src/stagehand/__init__.py | 98 | __all__ = [ | CODE |
| LOW | packages/sdk-python/src/stagehand/page.py | 507 | async def set_extra_http_headers(self, headers: Mapping[str, str]) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/browser_context.py | 75 | async def set_active_page(self, page: Page) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/browser_context.py | 100 | async def set_extra_http_headers(self, headers: Mapping[str, str]) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/client_types.py | 118 | __all__ = [ | CODE |
| LOW | …ges/integrations/core/python/tests/test_conformance.py | 134 | async def set_active_page(self, page: FakePage) -> None: | CODE |
| LOW | …ore/python/src/stagehand_middleware/facade/__init__.py | 20 | __all__ = [ | CODE |
| LOW | …ations/deepagents/src/stagehand_deepagents/__init__.py | 5 | __all__ = ["BrowserTools", "RuntimeConfig"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/evals/framework/claudeCodeToolAdapter.ts | 661 | // caveat appended after conflicting examples. | COMMENT |
| LOW | packages/evals/framework/claudeCodeToolAdapter.ts | 681 | // Unterminated/invalid YAML frontmatter -- fall back to the same | COMMENT |
| LOW | packages/evals/tui/repl.ts | 101 | } else { | COMMENT |
| LOW | packages/extension/understudy/context.ts | 701 | const resume = async (): Promise<void> => { | COMMENT |
| LOW | packages/docs/language-selector.js | 1 | // Language switcher for Stagehand docs | COMMENT |
| LOW | packages/integrations/middleware/src/index.ts | 1 | // The npm build of Stagehand's facade. The source lives in | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/evals/tui/commands/new.ts | 23 | // TODO: implement test logic | COMMENT |
| LOW | packages/evals/tui/commands/new.ts | 41 | // TODO: implement eval logic | COMMENT |
| LOW | packages/evals/tui/commands/new.ts | 73 | // TODO: implement eval logic | COMMENT |
| LOW | packages/evals/tests/tui/new.test.ts | 58 | expect(task?.content).toContain("// TODO: implement eval logic"); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/tests/test_rpc_client.py | 332 | async def handle_request(params: models.EmptyParams) -> RPCResult: | CODE |
| LOW | packages/sdk-ts/tests/integration/_support.ts | 116 | async function handleRequest( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …integrations/deepagents/runner/tests/test_watchdogs.py | 291 | CODE |