The SDK For Browser Agents
This report presents the forensic synthetic code analysis of browserbase/stagehand, a TypeScript project with 24,090 GitHub stars. SynthScan v2.0 examined 201,593 lines of code across 869 source files, recording 663 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 4.0 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 663 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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/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 | 134 | def test_stagehand_constructor_is_private() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 139 | def test_stagehand_does_not_expose_context() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 156 | async def test_experimental_batch_validates_arguments_before_transport( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 180 | async def test_experimental_batch_uses_registered_rpc_method( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 206 | async def test_experimental_batch_normalizes_json_object_keys( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 224 | async def test_experimental_batch_distinguishes_omitted_input_from_null( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 248 | async def test_experimental_batch_accepts_maximum_timeout( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 268 | async def test_experimental_batch_includes_an_explicit_page( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 290 | async def test_experimental_batch_maps_an_omitted_value_to_none( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 304 | async def test_create_requires_a_factory_browser_before_validating_config() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 313 | async def test_create_builds_wire_params_and_worker_metadata_wins( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 358 | async def test_create_omits_unset_browser_region_from_the_wire( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 376 | async def test_local_browser_omits_metadata_and_forwards_caller_options( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 414 | async def test_create_rejects_model_connection_options_for_missing_or_callback_models( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 428 | async def test_create_claim_errors_for_closed_and_attached_handles( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 446 | async def test_failed_create_releases_claim_and_keeps_browser_open_for_retry( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 472 | async def test_context_close_is_an_alias_for_browser_close( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 492 | async def test_invalid_success_response_fails_closed_because_initialization_is_ambiguous( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 511 | async def test_ambiguous_initialization_uses_browser_invalidation_not_public_close( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 550 | async def test_cancelled_create_fails_closed_and_prevents_same_browser_retry( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 604 | async def test_create_deadline_fails_closed_without_a_flaky_five_millisecond_timer( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 657 | async def test_failed_create_for_missing_cdp_url_can_retry_same_handle( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 675 | async def test_close_is_memoized_and_never_closes_browser_or_transport( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 710 | async def test_close_works_with_eager_task_factory( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 733 | async def test_close_swallows_cdp_connection_closed_error( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 753 | async def test_close_failure_retains_browser_claim( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 771 | async def test_stagehand_prints_logs_and_calls_structured_callback( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 808 | async def test_callback_llm_handler_preserves_structured_and_image_content( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 857 | async def test_stagehand_routes_metrics_and_ai_methods( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 974 | async def test_stagehand_observe_and_extract_serialize_active_page_locators( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1043 | async def test_stagehand_act_observe_and_extract_reject_cross_page_locators( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1068 | async def test_stagehand_extract_uses_default_schema( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1113 | async def test_stagehand_ai_methods_require_an_active_page( | CODE |
| LOW | packages/sdk-python/tests/test_stagehand.py | 1133 | def test_semantic_arguments_stay_positional(method: str, positional: list[str]) -> None: | 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 | packages/sdk-python/tests/test_generated_input_types.py | 26 | def test_every_registered_protocol_method_has_generated_python_params_input( | CODE |
| LOW | packages/sdk-python/tests/test_generated_input_types.py | 39 | def test_every_registered_notification_has_generated_python_params_input( | CODE |
| LOW | packages/sdk-python/tests/test_generated_input_types.py | 51 | def test_every_generated_typed_dict_resolves_its_references() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_generated_input_types.py | 63 | def test_generated_typed_dicts_are_plain_dictionary_inputs() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_generated_input_types.py | 76 | def test_generated_pydantic_params_validate_nested_typed_dicts() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_rpc_client.py | 76 | async def test_callback_batch_uses_the_normal_pending_request_path( | CODE |
| LOW | packages/sdk-python/tests/test_rpc_client.py | 112 | async def test_callback_batch_preserves_json_numbers_on_the_wire() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_rpc_client.py | 156 | async def test_send_validates_and_serializes_params_and_results() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_rpc_client.py | 225 | async def test_send_omits_unset_nested_file_metadata() -> None: | CODE |
| LOW | packages/sdk-python/tests/test_rpc_client.py | 261 | async def test_send_strictly_validates_root_model_results() -> None: | CODE |
| 371 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 | 68 | 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/_support.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_locator.py | 1 | CODE | |
| LOW | packages/sdk-python/tests/test_browser_clipboard.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 | 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 | packages/sdk-python/src/stagehand/cdp_client.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 | 19 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 22 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 23 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 55 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 58 | CODE | |
| LOW | packages/sdk-python/src/stagehand/__init__.py | 58 | CODE | |
| 44 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/evals/tui/commands/help.ts | 14 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 38 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 112 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 130 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 149 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 190 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 220 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 242 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 258 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 273 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 294 | print([ | CODE |
| HIGH | packages/evals/tui/commands/help.ts | 325 | print([ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/extension/tests/observe.test.ts | 23 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/observe.test.ts | 59 | expect(request?.systemPrompt).not.toContain("user@example.com"); | CODE |
| LOW | packages/extension/tests/observe.test.ts | 137 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/act.test.ts | 120 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/act.test.ts | 140 | ["user@example.com"], | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2269 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2277 | expect(page.locatorRefs[0]?.fillCalls).toStrictEqual(["user@example.com"]); | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2341 | inputValue: "user@example.com", | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2356 | await expect(runtime.locatorInputValue(descriptor)).resolves.toBe("user@example.com"); | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2488 | value: "user@example.com", | CODE |
| LOW | packages/extension/tests/stagehand-clients.test.ts | 2501 | expect(page.locatorRefs[0]?.fillCalls).toStrictEqual(["user@example.com"]); | CODE |
| LOW | …rotocol/tests/browser-runtime/rpc-client-smoke.test.ts | 327 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 257 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 270 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 290 | value: "user@example.com", | CODE |
| LOW | packages/protocol/tests/protocol/wire-casing.test.ts | 303 | value: "user@example.com", | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 249 | value: "user@example.com", | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 263 | value: "user@example.com", | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 298 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 306 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 461 | expect(StagehandMethods.locatorInputValue.result.parse("user@example.com")).toBe( | CODE |
| LOW | …/protocol/tests/protocol/object-model-protocol.test.ts | 462 | "user@example.com", | CODE |
| LOW | packages/integrations/core/src/facade/runtime.ts | 705 | return this.byAttribute("placeholder", value, options.exact); | CODE |
| LOW | …ts/examples/managed/tools/_assets/playwright_facade.js | 493 | return this.byAttribute("placeholder", value, options.exact); | CODE |
| LOW | …/src/stagehand_deepagents/_assets/playwright_facade.js | 493 | return this.byAttribute("placeholder", value, options.exact); | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1206 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1232 | variables: { accountEmail: "user@example.com" }, | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1307 | value: "user@example.com", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1332 | value: "user@example.com", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1562 | await page.locator("#email").fill("user@example.com"); | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1568 | value: "user@example.com", | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1605 | client.queueResponse(StagehandMethods.locatorInputValue, "user@example.com"); | CODE |
| LOW | packages/sdk-ts/tests/objectWrapper.test.ts | 1614 | 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 327 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 332 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 497 | except Exception: | CODE |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 535 | except Exception: | CODE |
| MEDIUM | packages/sdk-python/src/stagehand/cdp_client.py | 322 | def _read(self) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/page.py | 402 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/page.py | 432 | except Exception: | CODE |
| LOW | packages/sdk-python/src/stagehand/rpc_client.py | 348 | except Exception as error: | CODE |
| LOW | packages/sdk-python/src/stagehand/rpc_client.py | 459 | except Exception as error: | CODE |
| MEDIUM | packages/sdk-python/src/stagehand/rpc_client.py | 342 | def _read(self) -> None: | CODE |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 525 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 168 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 177 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 205 | except Exception as error: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 257 | except Exception: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 285 | except Exception: | CODE |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 296 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 72 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 346 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 372 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 381 | except Exception: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 412 | except Exception as error: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 423 | except Exception as error: | CODE |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 447 | except Exception as error: | CODE |
| LOW | …grations/deepagents/src/stagehand_deepagents/server.py | 184 | except Exception as error: | CODE |
| LOW | …grations/deepagents/src/stagehand_deepagents/server.py | 284 | except Exception as error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/evals/tui/repl.ts | 44 | // ─── Onboarding chrome ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/commands/verify.ts | 124 | // ── Build a verifier without launching a browser ──────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/commands/verify.ts | 154 | // ── Human summary ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/evals/tui/commands/verify.ts | 199 | // ── Persist ──────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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 | 43 | CODE | |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 428 | CODE | |
| LOW | packages/sdk-python/src/stagehand/cdp_client.py | 477 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 623 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 648 | CODE | |
| LOW | …ckages/sdk-python/src/stagehand/browserbase_session.py | 19 | CODE | |
| LOW | packages/sdk-python/src/stagehand/file_upload.py | 33 | CODE | |
| LOW | …rations/deepagents/examples/managed/tools/stagehand.py | 329 | CODE | |
| LOW | …grations/deepagents/src/stagehand_deepagents/server.py | 275 | 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 | 26 | marker: globalThis.__stagehand_runtime ?? null, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/src/stagehand/page.py | 507 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 355 | CODE | |
| LOW | packages/sdk-python/src/stagehand/browser.py | 523 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 117 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 330 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 371 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 332 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 374 | CODE | |
| LOW | packages/sdk-python/src/stagehand/stagehand.py | 403 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 860 | - [#586](https://github.com/browserbase/stagehand/pull/586) [`c57dc19`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | CHANGELOG.md | 860 | - [#586](https://github.com/browserbase/stagehand/pull/586) [`c57dc19`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | CHANGELOG.md | 1027 | - [#373](https://github.com/browserbase/stagehand/pull/373) [`ff00965`](https://github.com/browserbase/stagehand/commit/ | CODE |
| MEDIUM | CHANGELOG.md | 1027 | - [#373](https://github.com/browserbase/stagehand/pull/373) [`ff00965`](https://github.com/browserbase/stagehand/commit/ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/src/stagehand/__init__.py | 84 | __all__ = [ | CODE |
| LOW | packages/sdk-python/src/stagehand/page.py | 438 | 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 | 98 | __all__ = [ | CODE |
| LOW | …ations/deepagents/src/stagehand_deepagents/__init__.py | 5 | __all__ = ["BrowserTools", "RuntimeConfig"] | CODE |
| 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/evals/framework/claudeCodeToolAdapter.ts | 661 | insertAfterFrontmatter(cliSkill, EVAL_HARNESS_ADDENDUM), | COMMENT |
| LOW | packages/evals/framework/claudeCodeToolAdapter.ts | 681 | // reassemble from the ORIGINAL raw string so the frontmatter block that | COMMENT |
| LOW | packages/docs/language-selector.js | 1 | // Language switcher for Stagehand docs | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/sdk-python/tests/test_rpc_client.py | 330 | async def handle_request(params: models.EmptyParams) -> RPCResult: | CODE |
| LOW | packages/sdk-ts/tests/integration/_support.ts | 116 | async function handleRequest( | CODE |