AI Slop Code RIsk Monitor

teng-lin/notebooklm-py

Unofficial Python API and agentic skill for Google Gemini Notebook. Full programmatic access to NotebookLM's features—including capabilities the web UI doesn't expose—via Python, CLI, and AI agents like Claude Code, Codex, and OpenClaw.

19.9 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for teng-lin/notebooklm-py, a Python project with 19,683 GitHub stars. SynthScan examined 1,559,628 lines of code across 1984 source files, recording 23460 pattern matches distributed across 23 syntactic categories. The legacy adjusted pattern signal is 19.9 (Elevated 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.

19.9
Adjusted Signal
19.9
Raw Pattern Score
100%
Time Factor
2026-10-10
Last Push
19.7K
Stars
Python
Language
1.6M
Lines of Code
2.0K
Files
23.5K
Pattern Hits
2026-10-12
Scan Date
0.20
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 39.7/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 17227 finding(s).

Hallucinated Dependency & Supply Chain Risk 9.1/100 · LOW

Are imports declared and package/API names verified? 2554 finding(s).

Agent Over-Engineering Ratio 57.4/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 19833 finding(s).

PR Review Velocity Impact 63.4/100 · HIGH

Which changes need focused human review? 23460 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 18HIGH 386MEDIUM 2907LOW 20149

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 23460 distinct pattern matches across 23 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.

Hyper-Verbose Identifiers16113 hits · 14232 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py128def _isolate_backend_preference(CODE
LOWtests/conftest.py442def pytest_collection_modifyitems(config, items):CODE
LOWtests/conftest.py631def mock_list_notebooks_response():STRING
LOWtests/conftest.py751def legacy_vcr_follow_up_probe(monkeypatch):STRING
LOWtests/conftest.py762 async def _count_prior_server_turns(STRING
LOWtests/conftest.py774def legacy_vcr_add_url_baseline():CODE
LOWtests/cassette_patterns.py1674def synthetic_error_cassette_name(mode: str, slug: str) -> str:CODE
LOWtests/cassette_patterns.py1691def build_synthetic_error_response(CODE
LOWtests/vcr_config.py181def _substitute_synthetic_error(response: dict[str, Any]) -> dict[str, Any]:CODE
LOWtests/vcr_config.py564def _is_create_artifact_client_options(node: Any) -> bool:CODE
LOWtests/vcr_config.py580def _normalize_create_artifact_options(decoded_outer: Any) -> Any:CODE
LOWtests/_helpers/android_grpc_harness.py148def _inject_correlation_names(monkeypatch: pytest.MonkeyPatch, names: tuple[str, ...]) -> None:CODE
LOWtests/_helpers/downloads.py15def configure_complete_artifact_listing(mock_client: MagicMock) -> None:CODE
LOWtests/_helpers/downloads.py30def configure_prepared_artifact_downloads(mock_client: MagicMock) -> None:CODE
LOWtests/_helpers/android_phenotype_http_cassette.py55def _validate_phenotype_request(message: Any) -> None:CODE
LOWtests/_helpers/android_phenotype_http_cassette.py94def _scrub_phenotype_response(response: dict[str, Any]) -> dict[str, Any]:CODE
LOWtests/_helpers/android_phenotype_http_cassette.py160def build_phenotype_http_post(cassette_path: Path) -> PhenotypeHttpPost:CODE
LOWtests/_helpers/android_grpc_cassette.py137def _application_metadata_keys(metadata: Any) -> tuple[str, ...] | None:CODE
LOWtests/_helpers/android_grpc_cassette.py155def _check_placeholder_budget(count: int) -> None:CODE
LOWtests/_helpers/android_grpc_cassette.py266 def _trust_string_placeholder(self, value: str) -> bool:CODE
LOWtests/_helpers/client_factory.py32def build_client_shell_for_tests(CODE
LOW⚡tests/unit/test_artifacts_helpers.py30def test_extract_data_table_rows_happy_path() -> None:CODE
LOW⚡tests/unit/test_artifacts_helpers.py51def test_extract_data_table_rows_missing_inner_list() -> None:CODE
LOW⚡tests/unit/test_artifacts_helpers.py61def test_extract_data_table_rows_wrong_type_at_one_level() -> None:CODE
LOW⚡tests/unit/test_artifacts_helpers.py70def test_extract_data_table_rows_truncated_structure() -> None:CODE
LOW⚡tests/unit/test_artifacts_helpers.py83def test_extract_data_table_rows_non_list_inner_value(CODE
LOW⚡tests/unit/test_artifacts_helpers.py105def test_parse_data_table_raises_artifact_parse_error_on_drift() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py118def test_parse_data_table_raises_on_empty_rows() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py126def test_parse_data_table_happy_path() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py154def test_parse_data_table_skips_malformed_row_sections() -> None:CODE
LOW⚡tests/unit/test_json_stdout_purity.py340def _customize_suggest_prompts(client: MagicMock) -> None:CODE
LOW⚡tests/unit/test_json_stdout_purity.py349def _customize_suggest_next_steps(client: MagicMock) -> None:CODE
LOW⚡tests/unit/test_json_stdout_purity.py355def _customize_artifact_choices(client: MagicMock) -> None:CODE
LOW⚡tests/unit/test_json_stdout_purity.py1474def test_matched_partial_id_goes_to_stderr_in_json_mode(runner: CliRunner, mock_auth_env) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py242 async def wait_for_research_completion(CODE
LOWtests/unit/test_json_stdout_purity.py380def _customize_source_transfers(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py398def _customize_share_view_level(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py402def _customize_source_fulltext(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py456def _customize_source_add_book(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py462def _customize_source_add_research(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py474def _customize_research_discover(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py512def _customize_research_import(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py538def _customize_research_cancel(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py544def _customize_notebook_create(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py968def test_json_mode_stdout_is_parseable(CODE
LOWtests/unit/test_json_stdout_purity.py1374def test_all_json_commands_have_sweep_entry() -> None:CODE
LOWtests/unit/test_json_stdout_purity.py1493def test_matched_partial_id_still_goes_to_stdout_in_human_mode(CODE
LOWtests/unit/test_client_keepalive.py69async def _read_storage_text_when_available(storage_path):CODE
LOWtests/unit/test_client_keepalive.py79async def _wait_until_storage_contains(storage_path, needle: str, failure_message: str) -> None:CODE
LOWtests/unit/test_client_keepalive.py101async def test_storage_wait_retries_extended_sharing_violations(monkeypatch):CODE
LOWtests/unit/test_client_keepalive.py123async def _wait_for_rotate_requests(CODE
LOWtests/unit/test_client_keepalive.py144 async def test_keepalive_off_by_default(self, mock_auth, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py160 async def test_spawns_task_on_enter_cancels_on_exit(self, mock_auth, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py188 async def test_floor_clamps_low_interval(self, mock_auth):CODE
LOWtests/unit/test_client_keepalive.py198 async def test_floor_does_not_lower_higher_interval(self, mock_auth):CODE
LOWtests/unit/test_client_keepalive.py220 def test_rejects_non_positive_or_non_finite_keepalive(self, mock_auth, bad):CODE
LOWtests/unit/test_client_keepalive.py226 def test_rejects_non_positive_or_non_finite_floor(self, mock_auth, bad):CODE
LOWtests/unit/test_client_keepalive.py259 async def test_failure_does_not_crash_loop(self, mock_auth):CODE
LOWtests/unit/test_client_keepalive.py290 async def test_persistence_failure_logs_warning_and_continues(CODE
LOWtests/unit/test_client_keepalive.py338 async def test_explicit_storage_path_used_when_auth_lacks_one(CODE
16053 more matches not shown…
Decorative Section Separators2796 hits · 10749 pts
SeverityFileLineSnippetContext
MEDIUM⚡tests/cassette_patterns.py747# =============================================================================COMMENT
MEDIUM⚡tests/cassette_patterns.py749# =============================================================================COMMENT
MEDIUM⚡tests/cassette_patterns.py756 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py758 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py783 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py785 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py792 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py794 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py802 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py804 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py811 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py813 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py913 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py915 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py925 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py927 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py945 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py947 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py952 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py954 # -------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/cassette_patterns.py1307# =============================================================================COMMENT
MEDIUM⚡tests/cassette_patterns.py1309# =============================================================================COMMENT
MEDIUM⚡tests/cassette_patterns.py1312# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py137# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py139# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py255# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py257# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py308# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py310# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py324# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py326# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py369# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py371# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py417# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py419# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py544# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py546# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py827 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py829 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py854 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py856 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py894 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py896 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py967 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py969 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py991 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py993 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py1006# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1008# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1641# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1643# =============================================================================COMMENT
MEDIUMtests/vcr_config.py319# =============================================================================COMMENT
MEDIUMtests/vcr_config.py321# =============================================================================COMMENT
MEDIUMtests/vcr_config.py823# =============================================================================COMMENT
MEDIUMtests/vcr_config.py825# =============================================================================COMMENT
MEDIUM⚡tests/unit/test_artifacts_helpers.py25# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/unit/test_artifacts_helpers.py27# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/unit/test_artifacts_helpers.py46# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/unit/test_artifacts_helpers.py48# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/unit/test_artifacts_helpers.py78# ---------------------------------------------------------------------------COMMENT
2736 more matches not shown…
Unused Imports2317 hits · 1890 pts
SeverityFileLineSnippetContext
LOWhatch_build.py21CODE
LOWdesktop-extension/run_server.py24CODE
LOWtests/cassette_patterns.py131CODE
LOWtests/_helpers/android_grpc_harness.py20CODE
LOWtests/_helpers/android_grpc_normalizers.py11CODE
LOWtests/_helpers/android_notes.py3CODE
LOWtests/_helpers/android_supervisor.py3CODE
LOWtests/_helpers/play_book_http_cassette.py3CODE
LOWtests/_helpers/_v080_history.py7CODE
LOWtests/_helpers/android_phenotype_http_cassette.py10CODE
LOWtests/_helpers/android_grpc_cassette.py17CODE
LOWtests/_helpers/client_factory.py3CODE
LOWtests/_helpers/source_delete.py3CODE
LOWtests/unit/test_artifacts_helpers.py12CODE
LOWtests/unit/test_json_stdout_purity.py19CODE
LOWtests/unit/test_refresh_lock_registry.py20CODE
LOWtests/unit/test_from_storage_dual_protocol.py18CODE
LOWtests/unit/test_curl_cffi_transport_poc.py14CODE
LOWtests/unit/test_firefox_containers.py12CODE
LOWtests/unit/test_auth_patch_survivor_policy.py1CODE
LOWtests/unit/test_storage_writer.py12CODE
LOWtests/unit/test_vcr_scrubbing.py31CODE
LOWtests/unit/test_auth_refresh_profile_store.py3CODE
LOWtests/unit/test_chat_session_control.py3CODE
LOWtests/unit/test_play_books.py9CODE
LOWtests/unit/test_play_book_http_cassette.py3CODE
LOWtests/unit/test_auth_coverage_allowance_policy.py1CODE
LOWtests/unit/test_collection_exceptions.py3CODE
LOWtests/unit/test_auth_instance_invariant.py3CODE
LOWtests/unit/test_collections_api.py3CODE
LOWtests/unit/test_android_fault_cleanup.py3CODE
LOWtests/unit/test_auth_session_master_token.py3CODE
LOWtests/unit/test_vcr_config.py20CODE
LOWtests/unit/test_source_upload_coverage.py10CODE
LOWtests/unit/test_operation_context.py3CODE
LOWtests/unit/test_auth_master_token.py7CODE
LOWtests/unit/test_ci_account_pool_workflows.py3CODE
LOWtests/unit/test_tier_enforcement_hook.py41CODE
LOWtests/unit/test_auth_refresh_retry.py12CODE
LOWtests/unit/test_android_fault_scenarios.py3CODE
LOWtests/unit/test_deploy_compose_default.py10CODE
LOWtests/unit/test_auth_lock_path_derivation.py28CODE
LOWtests/unit/test_live_auth_matrix.py15CODE
LOWtests/unit/test_serving.py9CODE
LOWtests/unit/test_streaming_chat_wire.py3CODE
LOWtests/unit/test_streaming_chat_wire.py1033CODE
LOWtests/unit/test_get_or_none.py15CODE
LOWtests/unit/test_audit_auth_import_graph.py3CODE
LOWtests/unit/test_browser_capture_cdp_arm.py25CODE
LOWtests/unit/test_concurrency_refresh_race.py60CODE
LOWtests/unit/test_fault_cohort_cleanup.py3CODE
LOWtests/unit/test_middleware_chain_host.py28CODE
LOWtests/unit/test_auth_cold_start_recovery.py3CODE
LOWtests/unit/test_artifact_completeness.py3CODE
LOWtests/unit/test_capture_rpc_registry.py8CODE
LOWtests/unit/test_generation_state.py15CODE
LOWtests/unit/test_research_row_adapter.py15CODE
LOWtests/unit/test_auth_credential_io.py3CODE
LOWtests/unit/test_with_client_handle_errors.py20CODE
LOWtests/unit/test_curl_fault_cleanup.py3CODE
2257 more matches not shown…
Cross-Language Confusion139 hits · 794 pts
SeverityFileLineSnippetContext
HIGHtests/cassette_patterns.py874 r'("SCRUBBED_EMAIL@example\.com","","(?:[^"\\]|\\.)*",0,0,null,"",1,")'CODE
HIGHtests/vcr_config.py709 # Streaming-chat envelope: [null, "<inner_json>"].COMMENT
HIGHtests/vcr_config.py634 1. **Streaming-chat envelope** ``[null, "<inner_json>"]`` where the innerSTRING
HIGHtests/vcr_config.py640 2. **Batchexecute envelope** ``[[[rpc_id, args_json, null, "generic"]]]``STRING
HIGHtests/unit/test_vcr_config.py98 JSON envelope is ``[null, "<inner_json>"]`` and ``<inner_json>`` is itself aSTRING
HIGH⚡tests/unit/test_check_rpc_health.py1063 return ")]}'\n\n" + f'[["wrb.fr","{_CHOICES_ID}",{inner},null,null,null,"generic"]]'CODE
HIGH⚡tests/unit/test_check_rpc_health.py1221 body = ")]}'\n\n" + f'[["wrb.fr","{_CHOICES_ID}",null,null,null,[3],"generic"]]'CODE
HIGH⚡tests/unit/test_check_rpc_health.py1235 body = ")]}'\n\n" + '[["wrb.fr","zzzzzz","[[]]",null,null,null,"generic"]]'CODE
HIGH⚡tests/unit/test_decoder.py1286 payload = f'[["wrb.fr","{self.RPC_ID}",null,null,null,{deep}]]'CODE
HIGH⚡tests/unit/test_decoder.py1294 payload = f'[["wrb.fr","{self.RPC_ID}",null,null,null,{deep}]]'CODE
HIGHtests/unit/test_decoder.py893 """``[5, null, 'x']`` is the same google.rpc.Status at a longer arity.STRING
HIGH⚡tests/unit/test_sources_row_adapter.py862# 402x [null, 2] — no Drive-status slotCOMMENT
HIGH⚡tests/unit/test_sources_row_adapter.py863# 4x [null, 2, null, 3] — Drive-backed, ACTIVECOMMENT
HIGH⚡tests/unit/test_sources_row_adapter.py864# 3x [null, 2, [null,null,null,[]]] — a populated settings[2], no [3]COMMENT
HIGH⚡tests/unit/test_sources_row_adapter.py692 """A live-shaped web-page row (``metadata[0]`` null, URL at ``[7]``) yields None.STRING
HIGH⚡tests/unit/test_sources_row_adapter.py879 """settings ``[null, 2, null, 3]`` — the only populated shape seen live."""STRING
HIGH⚡tests/unit/test_sources_row_adapter.py887 """settings ``[null, 2]`` — 402 of 409 live rows. No Drive claim at all."""STRING
HIGH⚡tests/unit/test_sources_row_adapter.py894 """settings ``[null, 2, [null,null,null,[]]]`` — 3 of 409 live rows.STRING
HIGH⚡tests/unit/test_collection_params.py93 # Owner capture: [ [null,null,null,[[nbid]]], [] ] with the type-3 tail.COMMENT
HIGHtests/unit/test_api_coverage.py151 # Real API returns 3 levels of nesting: [[[null, [summary], [[keywords]], []]]]COMMENT
HIGHtests/unit/test_api_coverage.py188 # Response format: [[[title, description, null, null, prompt, audience_level], ...]]COMMENT
HIGH⚡tests/unit/test_api_coverage.py317 # Verify reference payload: [null, ["source_id"], [2]]COMMENT
HIGH⚡tests/unit/test_api_coverage.py333 # Verify reference payload: [null, ["source_id"], [2]]COMMENT
HIGHtests/unit/test_authed_post_pipeline.py1717 decoded_payload = b')]}\'\n\n[["wrb.fr",null,"[1]",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_select_artifact.py276 ever emits ``[null, ...]`` at index 15 the sort must coerce thatSTRING
HIGHtests/unit/test_auth_cookie_save_race.py1067 f"None-valued cookie must never be persisted as value:null, got: {stored}"CODE
HIGHtests/unit/test_save_chat_as_note_encoder.py136 # passage[3] = [[null, start, end]]; passage[5] = [[[passage_id], source_id]];COMMENT
HIGHtests/unit/test_save_chat_as_note_encoder.py232 assert "[0,0,0,null,null,null,null,0,0]" in actual_jsonCODE
HIGHtests/unit/test_browser_oauth_token.py495 page.evaluate("url => history.replaceState(null, '', url)", consent_url)CODE
HIGH⚡tests/unit/test_user_settings_api.py145# GET_USER_SETTINGS inner: [[null,[..limits..],[true,null,null,true,["fr"]],COMMENT
HIGH⚡tests/unit/test_user_settings_api.py147# SET_USER_SETTINGS inner: [null,[..limits..],[true,null,null,true,["en"]],COMMENT
HIGHtests/unit/test_rate_limit_retry.py48 resp.text = ")]}'\n[null,[" + str(payload).replace("'", '"') + "]]"CODE
HIGHtests/unit/test_rescrub_cassettes_script.py87 '0,0,null,"",1,"SCRUBBED_NAME","SCRUBBED_AVATAR_URL"]]'CODE
HIGHtests/unit/test_rescrub_cassettes_script.py96 f'[["wrb.fr","JFMDGd","[[null,[\\"{avatar_url}\\"]]]",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_research_api.py919 # Live shape for the Drive corpus: ``[null, null, null, null, 1]`` plusCOMMENT
HIGHtests/unit/test_scrub_rpc_har.py59 freq = json.dumps([[["CCqFvf", '["t",null,null,[2],[1]]', None, "generic"]]])CODE
HIGHtests/unit/test_scrub_rpc_har.py146 freq = json.dumps([[["CCqFvf", '["t",null,null,[2],[1]]', None, "generic"]]])CODE
HIGHtests/unit/test_mutation_null_status.py418 null), ``SHARE_NOTEBOOK`` / ``SHARE_ARTIFACT`` /STRING
HIGH⚡tests/unit/test_rpc_overrides.py246 '{"LIST_NOTEBOOKS": null, "CREATE_NOTEBOOK": "valid"}',CODE
HIGHtests/unit/test_cassette_patterns.py983 '[["SCRUBBED_EMAIL@example.com","","opaque",0,0,null,"",1,'CODE
HIGHtests/unit/test_cassette_patterns.py1002 '0,0,null,"",1,"SCRUBBED_NAME","SCRUBBED_AVATAR_URL"]]'CODE
HIGHtests/unit/test_ci_test_matrix.py406 assert checkout["with"]["ref"] == "${{ inputs.custom_branch || github.ref }}"CODE
HIGHtests/unit/test_ci_test_matrix.py625 "ref": "${{ inputs.custom_branch || github.sha }}",CODE
HIGH⚡tests/unit/test_vcr_body_matcher.py117 """Build a streaming-chat ``f.req`` form body (`[null, "<inner_json>"]`)."""STRING
HIGH⚡tests/unit/test_vcr_body_matcher.py208 fixtures: the cassette has a trailing ``[null, null]`` while the liveSTRING
HIGHtests/unit/test_vcr_body_matcher.py106 is ``[[[rpc_id, "<args_json>", null, "generic"]]]`` and ``<args_json>``STRING
HIGHtests/unit/test_vcr_body_matcher.py394 The outer ``[[[rpc, "...", null, "generic"]]]`` shape parses cleanly,STRING
HIGH⚡tests/unit/test_chat_row_adapter.py402 # ``[None]`` (leading slot present but null) yields ``None`` — theCOMMENT
HIGHtests/unit/test_source_selection.py1060 # Response format: [[[title, description, null, null, prompt, audience_level], ...]]COMMENT
HIGHtests/unit/mcp/test_profile_files.py114 if (message.method === 'tools/call') calls.push(message.params);CODE
HIGHtests/unit/mcp/test_profile_files.py119 callTool: async (name, args) => calls.push({name, arguments: args})CODE
HIGH⚡tests/unit/mcp/test_sources.py314 # ``status: Literal[...] | None`` serializes as an ``anyOf`` of {enum} + {null}.COMMENT
HIGH⚡tests/unit/mcp/test_sources.py2240 {"source": null} as success — it projects NOT_FOUND."""STRING
HIGH⚡tests/unit/mcp/test_uploadwidget.py80 assert "uploadUrls[i]=null;confirmUpload(tok)" in _WIDGET_HTMLCODE
HIGH⚡tests/unit/mcp/test_uploadwidget.py106 callTool: async (name, args) => { confirms.push({name, args}); }CODE
HIGH⚡tests/unit/mcp/test_uploadwidget.py113 headers: {get: () => null}, text: async () => "transient or recovered"};CODE
HIGH⚡tests/unit/mcp/test_uploadwidget.py117 headers: {get: name => name === 'X-NotebookLM-Upload-Status' ? 'unconfirmed' : null},CODE
HIGHtests/unit/cli/test_usage.py84 """JSON keeps precision, zero versus null, enum names, and reset offsets."""STRING
HIGHtests/unit/cli/test_note.py578 CLI emitted ``{"id": null, "created": false, "error": "Creation maySTRING
HIGHtests/unit/cli/test_playwright_login_render_contract.py760 " 2. Or run: notebooklm auth logout && notebooklm login\n"CODE
79 more matches not shown…
Empty Error Handlers101 hits · 505 pts
SeverityFileLineSnippetContext
HIGHtests/vcr_config.py173except UnicodeDecodeError:CODE
HIGHtests/vcr_config.py275except UnicodeDecodeError:CODE
HIGHtests/vcr_config.py440except UnicodeDecodeError:CODE
HIGHtests/vcr_config.py425except UnicodeDecodeError:CODE
HIGHtests/_helpers/android_grpc_cassette.py659except FileNotFoundError:CODE
HIGHtests/unit/test_client_keepalive.py88except PermissionError:CODE
HIGHtests/unit/test_refresh_lock_registry.py379except threading.BrokenBarrierError:CODE
HIGHtests/unit/test_curl_cffi_transport_poc.py59except (BrokenPipeError, ConnectionResetError):CODE
HIGHtests/unit/test_operation_context.py186except asyncio.CancelledError:CODE
HIGHtests/unit/test_operation_context.py208except asyncio.CancelledError:CODE
HIGHtests/unit/test_web_asset_lifecycle.py331except asyncio.CancelledError:CODE
HIGHtests/unit/test_web_asset_lifecycle.py384except asyncio.CancelledError:CODE
HIGHtests/unit/test_web_asset_lifecycle.py372except asyncio.CancelledError:CODE
HIGHtests/unit/test_polling_registry.py52except asyncio.CancelledError:CODE
HIGHtests/unit/test_session_close.py59except asyncio.CancelledError:CODE
HIGHtests/unit/test_auth_cold_recovery_coordinator.py446except RuntimeError:CODE
HIGHtests/unit/app/test_source_fetch.py248except (BrokenPipeError, ConnectionResetError):CODE
HIGHtests/unit/concurrency/test_close_cancellation_leak.py370except Exception:CODE
HIGHtests/integration/conftest.py395except ImportError:CODE
HIGHtests/integration/conftest.py401except ImportError:CODE
HIGHtests/integration/test_chat_oversized_rejection_vcr.py144except Exception: # noqa: BLE001 — best-effort scratch cleanupCODE
HIGHtests/integration/cli_vcr/conftest.py172except json.JSONDecodeError:CODE
HIGHtests/integration/cli_vcr/conftest.py184except json.JSONDecodeError:CODE
HIGHtests/integration/cli_vcr/test_auth.py103except (OSError, NotImplementedError):CODE
HIGHtests/integration/cli_vcr/test_doctor.py63except (OSError, NotImplementedError):CODE
HIGH…ntegration/concurrency/test_aexit_exception_masking.py155except asyncio.CancelledError:CODE
HIGHtests/integration/concurrency/test_helpers.py227except asyncio.CancelledError:CODE
HIGHtests/integration/concurrency/helpers.py265except BaseException: # noqa: BLE001 — cleanup must not propagateCODE
HIGHtests/e2e/conftest.py30except ImportError:CODE
HIGHtests/e2e/conftest.py1186except Exception:CODE
HIGHtests/e2e/conftest.py1199except Exception:CODE
HIGHtests/e2e/conftest.py1442except Exception:CODE
HIGHtests/e2e/conftest.py887except OSError:CODE
HIGHtests/e2e/conftest.py1219except Exception:CODE
HIGHtests/e2e/conftest.py1350except Exception:CODE
HIGHtests/e2e/conftest.py1184except Exception:CODE
HIGHtests/e2e/conftest.py1440except Exception:CODE
HIGHtests/e2e/conftest.py1197except Exception:CODE
HIGHtests/e2e/_collection_candidate.py123except Exception:CODE
HIGHtests/e2e/_generation_journal.py175except OSError:CODE
HIGHexamples/notes.py141except json.JSONDecodeError:CODE
HIGHscripts/_ci_progress.py30except OSError:CODE
HIGHscripts/decode_mobile_grpc.py94except ValueError:CODE
HIGHscripts/_ci_e2e_notebooks.py526except FileNotFoundError:CODE
HIGHscripts/_ci_e2e_notebooks.py439except FileNotFoundError:CODE
HIGHscripts/materialize_ci_auth.py133except FileNotFoundError:CODE
HIGHscripts/materialize_ci_auth.py106except FileNotFoundError:CODE
HIGHscripts/audit_public_api_compat.py593except json.JSONDecodeError:CODE
HIGHscripts/manage_ci_e2e_notebooks.py1301except Exception:CODE
HIGHscripts/audit_backend_coupling.py163except TypeError:CODE
HIGHscripts/audit_backend_coupling.py174except AttributeError:CODE
HIGHscripts/live_auth_matrix.py225except (OSError, subprocess.TimeoutExpired):CODE
HIGHscripts/live_auth_matrix.py230except ProcessLookupError:CODE
HIGHscripts/live_auth_matrix.py892except ProcessLookupError:CODE
HIGHscripts/stress_fault_server.py460except (OSError, TypeError, ValueError):CODE
HIGHsrc/notebooklm/_curl_cffi_transport.py210except Exception: # noqa: BLE001 — cleanup must not mask the original errorCODE
HIGHsrc/notebooklm/notebooklm_cli.py68except (AttributeError, OSError, TypeError, ValueError):CODE
HIGHsrc/notebooklm/migration.py206except FileNotFoundError:CODE
HIGHsrc/notebooklm/_android/auth.py159except BaseException:CODE
HIGHsrc/notebooklm/_android/upload.py526except BaseException:CODE
41 more matches not shown…
Modern Structural Boilerplate436 hits · 440 pts
SeverityFileLineSnippetContext
LOWtests/_helpers/android_grpc_harness.py385__all__ = [CODE
LOWtests/_helpers/android_grpc_normalizers.py40__all__ = ["REQUEST_NONCE_FIELDS", "normalize_request"]CODE
LOWtests/_helpers/android_notes.py90__all__ = ["StatefulAndroidNotesTransport"]CODE
LOWtests/_helpers/android_supervisor.py80__all__ = ["SupervisedAndroidTransport"]CODE
LOWtests/_helpers/play_book_http_cassette.py65def _set_content_length(headers: Any, length: int) -> None:CODE
LOWtests/_helpers/play_book_http_cassette.py161__all__ = ["PlayBookHttpCassetteScrubber", "SYNTHETIC_BOOK_ROWS"]CODE
LOWtests/_helpers/android_phenotype_http_cassette.py35def _set_content_length(headers: Any, length: int) -> None:CODE
LOWtests/_helpers/android_phenotype_http_cassette.py189__all__ = ["PhenotypeHttpPost", "build_phenotype_http_post"]CODE
LOWtests/_helpers/android_grpc_cassette.py1054__all__ = [CODE
LOW⚡tests/unit/test_json_stdout_purity.py581def _setup_fs_doctor(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py623def _setup_fs_profile_list(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/test_auth_refresh_profile_store.py99def _set_live(live: httpx.Cookies, name: str, value: str) -> None:CODE
LOWtests/unit/test_auth_cookie_save_race.py108def _set_cookie_value(jar: httpx.Cookies, name: str, value) -> None:CODE
LOWtests/unit/test_client_lifecycle_waves.py43 def set_bound_loop(self, loop: asyncio.AbstractEventLoop) -> None:CODE
LOWtests/unit/test_client_lifecycle_waves.py94 def set_bound_loop(self, loop: asyncio.AbstractEventLoop) -> None:CODE
LOWtests/unit/test_runtime_lifecycle.py35 def set_bound_loop(self, loop: asyncio.AbstractEventLoop) -> None:CODE
LOWtests/unit/test_runtime_lifecycle.py68 def set_bound_loop(self, loop: asyncio.AbstractEventLoop) -> None:CODE
LOWtests/unit/test_lazy_web_sidecar.py42 def set_bound_loop(self, loop: asyncio.AbstractEventLoop) -> None:CODE
LOWtests/unit/mcp/conftest.py156__all__ = ["AsyncMock"] # re-exported for convenience in tool testsCODE
LOWtests/unit/mcp/test_entrypoint.py59def _set_oauth_env(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/cli/test_cli_mcp_parity.py220 def _setup(c: Any) -> None:CODE
LOWtests/unit/cli/test_cli_mcp_parity.py235 def _setup(c: Any) -> None:CODE
LOWtests/_baselines/registry.py522__all__ = [CODE
LOWtests/_baselines/storage_transaction_policy.py72__all__ = [CODE
LOWtests/_baselines/__init__.py20__all__ = ["BASELINES", "Baseline"]CODE
LOWtests/_baselines/module_size.py152__all__ = [CODE
LOWtests/_baselines/guardrail_literals.py79__all__ = [CODE
LOWtests/_guardrails/_v100_breaks.py210__all__ = [CODE
LOW⚡tests/_guardrails/test_cookie_persistence_boundary.py574 def _set_local_client(self, name: str, value: bool) -> None:CODE
LOW⚡tests/integration/test_android_grpc_cassette.py321async def _settle(seconds: float) -> None:CODE
LOWtests/integration/test_transfer_rpcs_vcr.py56async def _settle(seconds: float) -> None:CODE
LOWtests/integration/cli_vcr/_cassette_expectations.py304__all__ = [CODE
LOWtests/integration/cli_vcr/conftest.py59__all__ = [CODE
LOWtests/integration/cli_vcr/_fixtures.py87__all__ = [CODE
LOW⚡tests/integration/concurrency/conftest.py58logger = logging.getLogger(__name__)CODE
LOWtests/integration/concurrency/conftest.py210 def set_delay(self, seconds: float) -> None:CODE
LOWtests/integration/concurrency/test_chat_history_race.py170 def set_answer(self, question: str, answer: str) -> None:CODE
LOWtests/integration/concurrency/helpers.py47logger = logging.getLogger(__name__)CODE
LOWtests/integration/mcp_vcr/conftest.py42__all__ = ["build_mcp_client", "build_zero_retry_mcp_client"]CODE
LOWtests/server/fakes.py344 async def set_mode(self, notebook_id: str, mode: Any) -> None:CODE
LOWtests/server/fakes.py830 def set_research_failed(self, notebook_id: str, poll_id: str, *, query: str = "q") -> None:CODE
LOWtests/_fixtures/rpc_error_frames.py18__all__ = [CODE
LOWtests/_fixtures/chain.py122__all__ = [CODE
LOWtests/_fixtures/__init__.py23__all__ = [CODE
LOWtests/_fault_server/grpc.py470__all__ = [CODE
LOWtests/_fault_server/web.py157__all__ = [CODE
LOWtests/_fault_server/android_scenarios.py756__all__ = ["SCENARIOS", "run_scenario"]CODE
LOWtests/_fault_server/web_workflows.py589__all__ = ["SCENARIOS", "run_scenario"]CODE
LOWtests/_fault_server/adapter_scenarios.py643__all__ = ["SCENARIOS", "run_scenario"]CODE
LOWtests/_fault_server/web_resilience_scenarios.py858__all__ = ["BUDGETS", "IMPLEMENTATIONS", "PLANS", "REQUIRED_CHECKS", "SCENARIOS"]CODE
LOWtests/_fault_server/android.py168__all__ = [CODE
LOWtests/_fault_server/http.py712__all__ = [CODE
LOWtests/_fault_server/web_concurrency.py438__all__ = ["BUDGETS", "IMPLEMENTATIONS", "PLANS", "REQUIRED_CHECKS"]CODE
LOWtests/_fault_server/web_generation_faults.py345__all__ = ["BUDGETS", "IMPLEMENTATIONS", "REQUIRED_CHECKS", "SCENARIOS"]CODE
LOWtests/_fault_server/android_resilience_scenarios.py173__all__ = ["IMPLEMENTATIONS", "PLANS", "SCENARIOS"]CODE
LOWtests/_fault_server/web_scenarios.py808__all__ = ["SCENARIOS", "run_scenario"]CODE
LOWtests/e2e/_collection_candidate.py243__all__ = ["created_collection_candidate"]CODE
LOWscripts/_tracked_files.py29__all__ = ["tracked_files"]CODE
LOWscripts/_live_auth_scenarios/__init__.py48__all__ = [CODE
LOWsrc/notebooklm/_sharing.py11logger = logging.getLogger(__name__)CODE
376 more matches not shown…
Docstring Block Structure75 hits · 375 pts
SeverityFileLineSnippetContext
HIGHtests/cassette_patterns.py155Re-derive ``<count>`` prefixes in a chunked response body. Google's batchexecute responses are framed as alternatinSTRING
HIGHtests/cassette_patterns.py1694Return a ``(status_code, body, headers)`` triple for a synthetic error. The shape is intentionally minimal; the cliSTRING
HIGHsrc/notebooklm/_sharing.py48Share notebook with a user. Intent wrapper over :meth:`set_users`. The underlying operation is an upserSTRING
HIGHsrc/notebooklm/_notes.py65Get a specific note by ID. Args: notebook_id: The notebook ID. note_id: The note ID. STRING
HIGHsrc/notebooklm/paths.py225Get directory for a specific profile. Args: profile: Profile name. If None, resolves via resolve_profile().STRING
HIGHsrc/notebooklm/client.py710Create a client from Playwright storage state file. This is the recommended way to create a client for programmSTRING
HIGHsrc/notebooklm/client.py904Refresh the selected backend's authentication state. Web refreshes the NotebookLM homepage to obtain a fresh CSSTRING
HIGHsrc/notebooklm/_chat.py309Ask the notebook a question. Args: notebook_id: The notebook ID. question: The questionSTRING
HIGHsrc/notebooklm/_chat.py667Save a chat answer as a citation-rich note (issue #660). Unlike :meth:`NotesAPI.create`, this preserves the ``[STRING
HIGHsrc/notebooklm/_chat.py794Read the notebook's current chat configuration. Decodes the chat-settings block from ``GET_NOTEBOOK`` so a *parSTRING
HIGHsrc/notebooklm/_sources.py186Get details of a specific source. Args: notebook_id: The notebook ID. source_id: The soSTRING
HIGHsrc/notebooklm/_sources.py241Wait for a source to become ready. Polls until READY, terminal ERROR, or timeout. Configured transient STRING
HIGHsrc/notebooklm/_sources.py331Wait for a source to be registered server-side (status >= PROCESSING). Polls until the source is visible in theSTRING
HIGHsrc/notebooklm/_sources.py382Wait for multiple sources to become ready in parallel. Args: notebook_id: The notebook ID. STRING
HIGHsrc/notebooklm/_sources.py516Add a file source using the backend's resumable upload pipeline. Registers the source, opens an upload session,STRING
HIGHsrc/notebooklm/utils.py159Return the surrounding source-text passage for a chat citation. A :class:`~notebooklm.types.ChatReference` carries STRING
HIGHsrc/notebooklm/_lookup.py28Return ``obj`` unchanged, or raise ``exc`` when ``obj`` is ``None``. The narrow contract is deliberate: callers pasSTRING
HIGHsrc/notebooklm/artifacts.py84Run an artifact-generation callable with rate-limit retry. The callable is always invoked at least once. A retry isSTRING
HIGHsrc/notebooklm/_mind_maps_api.py243Rename a mind map (dispatches by kind: ``UPDATE_NOTE`` / ``RENAME_ARTIFACT``). Omitting ``kind`` triggers an exSTRING
HIGHsrc/notebooklm/_types/documents.py817A readable flat rendering of the document, or of one range of it. The third of this library's three renderings STRING
HIGHsrc/notebooklm/_auth/cookies.py182Extract Google cookies from Playwright storage state for NotebookLM auth. Filters through the canonical auth-domainSTRING
HIGHsrc/notebooklm/_auth/cookies.py375Load cookies as an httpx.Cookies object for authenticated downloads. Unlike load_auth_from_storage() which returns STRING
HIGHsrc/notebooklm/_auth/cookies.py415Extract Google cookies from storage state preserving original identity. Returns a path-aware ``(name, domain, path)STRING
HIGHsrc/notebooklm/_auth/cookies.py507Build an httpx.Cookies jar with original domains preserved. This function loads cookies from storage and creates a STRING
HIGHsrc/notebooklm/_auth/tokens.py290Return the ``Cookie:`` header this session would send to ``url``. .. deprecated:: 0.8.1 Scheduled foSTRING
HIGHsrc/notebooklm/_auth/tokens.py462Create AuthTokens from Playwright storage state file. Compatibility loader for callers that still need a standaSTRING
HIGHsrc/notebooklm/_auth/tokens.py866Load Google cookies from storage as a flat name→value dict. Loads authentication cookies with the following precedeSTRING
HIGHsrc/notebooklm/_auth/extraction.py87Extract a ``WIZ_global_data[key]`` value from a NotebookLM HTML response. NotebookLM (and other Google products) emSTRING
HIGHsrc/notebooklm/_auth/extraction.py447 Extract CSRF token (SNlM0e) from NotebookLM page HTML. The CSRF token is embedded in the page's WIZ_global_datSTRING
HIGHsrc/notebooklm/_auth/extraction.py490 Extract session ID (FdrFJe) from NotebookLM page HTML. The session ID is embedded in the page's WIZ_global_datSTRING
HIGHsrc/notebooklm/_auth/refresh.py971Internal: fetch CSRF and session tokens using a pre-built cookie jar. This is the single implementation for all tokSTRING
HIGHsrc/notebooklm/_auth/refresh.py1077Fetch tokens from a cookie mapping. For backward compatibility. Prefer NotebookLMClient.from_storage(), which preseSTRING
HIGHsrc/notebooklm/_auth/refresh.py1184Validate the auth cookies on disk without any side effects. Performs the same token-fetch round-trip (a homepage GESTRING
HIGHsrc/notebooklm/_auth/account.py112Enumerate Google accounts visible to the given cookie jar. Probes ``<configured base URL>/?authuser=N`` (see :fSTRING
HIGHsrc/notebooklm/mcp/_resolve.py280Resolve a notebook reference (full/partial id, exact title, or unique title prefix) to its id. Args: clientSTRING
HIGHsrc/notebooklm/mcp/_resolve.py308Resolve a source reference within a notebook to its id. Args: client: The lifespan-bound client. noSTRING
HIGHsrc/notebooklm/mcp/_resolve.py339Resolve many source references within a notebook, listing sources at most once. The per-tool callers ``chat_ask`` /STRING
HIGHsrc/notebooklm/mcp/_resolve.py439Resolve a note reference within a notebook to its id. Same matching rules as :func:`resolve_source`, over the notebSTRING
HIGHsrc/notebooklm/mcp/_resolve.py470Resolve a studio-artifact reference within a notebook to its id. Same matching rules as :func:`resolve_source`, oveSTRING
HIGHsrc/notebooklm/cli/resolve.py44Validate and normalize an entity ID. Args: entity_id: The ID to validate. entity_name: Name for errSTRING
HIGHsrc/notebooklm/cli/resolve.py127Get notebook ID from argument, env var, or active context. Resolution order (env-var precedence): 1. ``notebooSTRING
HIGHsrc/notebooklm/cli/resolve.py214Resolve a partial ID against a **pre-fetched** item list. Sync core of the partial-ID matching logic. Encapsulates STRING
HIGHsrc/notebooklm/cli/resolve.py346Resolve a case-insensitive partial ID prefix to a full entity ID. Allows users to type partial IDs like ``abc`` insSTRING
HIGHsrc/notebooklm/cli/_firefox_containers.py231Resolve a ``--browser-cookies 'firefox::<spec>'`` to a selector. Args: profile_path: Firefox profile directSTRING
HIGHsrc/notebooklm/cli/_firefox_containers.py420Read ``cookies.sqlite`` filtered to a single container. Args: profile_path: Firefox profile directory contaSTRING
HIGHsrc/notebooklm/cli/_chromium_profiles.py316Read and decrypt cookies from a single Chromium user-data profile. Uses ``rookie_cookies.any_browser(db_path, domaiSTRING
HIGHsrc/notebooklm/cli/download_helpers.py34Resolve a partial artifact ID to a full ID. UUID-shaped IDs (canonical 8-4-4-4-12 hex layout, case-insensitive - STRING
HIGHsrc/notebooklm/cli/auth_runtime.py84Get auth components from context. Args: ctx: Click context with optional storage_path in obj Returns: STRING
HIGHsrc/notebooklm/cli/input.py11Read all of stdin as UTF-8 text and strip surrounding whitespace. Centralizes the Unix ``-`` stdin convention used STRING
HIGHsrc/notebooklm/cli/input.py44Resolve prompt text from a positional argument or ``--prompt-file``. Exactly one source may be provided. The file/sSTRING
HIGHsrc/notebooklm/cli/services/login/cookie_jar.py81Probe ``?authuser=N`` against one cookie set and return tagged Accounts. Shared by both the legacy single-jar path STRING
HIGHsrc/notebooklm/cli/services/login/profile_targets.py46Derive a valid profile name from an email address. Profile names are restricted to ``[a-zA-Z0-9_-]`` (see :dataSTRING
HIGHsrc/notebooklm/_web/sharing.py318Set several users' permissions on a notebook in one request. This is an **upsert**, not an add: an email that iSTRING
HIGHsrc/notebooklm/_web/research.py211Start a research session. Args: notebook_id: The notebook ID. query: The research querySTRING
HIGHsrc/notebooklm/_web/research.py321Discover web sources synchronously (the "Discover sources" dialog call). One blocking ``DISCOVER_SOURCES`` rounSTRING
HIGHsrc/notebooklm/_web/notes.py628Get a specific note by ID. Args: notebook_id: The notebook ID. note_id: The note ID. STRING
HIGHsrc/notebooklm/_web/notebooks.py432Get AI-suggested prompts for a notebook. Backed by ``GeneratePromptSuggestions`` (``otmP3b``): a *general* STRING
HIGHsrc/notebooklm/_web/notebooks.py732Get notebook details. Args: notebook_id: The notebook ID. Returns: Notebook obSTRING
HIGHsrc/notebooklm/_web/transport/reqid_counter.py173Atomically increment the counter and return the new value. Args: step: Increment applied to the couSTRING
HIGHsrc/notebooklm/_web/wire/decoder.py295 Parse chunked response format (rt=c mode). Format is alternating lines of: - byte_count (integer) - jsSTRING
15 more matches not shown…
Deep Nesting408 hits · 368 pts
SeverityFileLineSnippetContext
LOWtests/cassette_patterns.py596CODE
LOWtests/vcr_config.py627CODE
LOWtests/vcr_config.py679CODE
LOWtests/_helpers/play_book_http_cassette.py94CODE
LOWtests/_helpers/android_grpc_cassette.py334CODE
LOWtests/unit/test_live_auth_matrix.py1043CODE
LOWtests/unit/test_streaming_chat_wire.py1006CODE
LOWtests/unit/test_concurrency_refresh_race.py501CODE
LOWtests/unit/test_auth_cold_start_recovery.py620CODE
LOWtests/unit/test_auth_profile_store_minted.py723CODE
LOWtests/unit/test_auth_psidts_recovery.py433CODE
LOWtests/unit/test_app_master_token.py573CODE
LOWtests/unit/test_sources_row_adapter.py80CODE
LOWtests/unit/test_browser_oauth_token.py460CODE
LOWtests/unit/test_auth_mint_service.py146CODE
LOWtests/unit/test_init_order.py171CODE
LOWtests/unit/test_browser_capture_session_candidate.py566CODE
LOWtests/unit/test_browser_capture_session_candidate.py582CODE
LOWtests/unit/test_rpc_types.py67CODE
LOWtests/unit/test_historical_split.py38CODE
LOWtests/unit/test_rpc_overrides.py72CODE
LOWtests/unit/test_auth_remaining_branches.py521CODE
LOWtests/unit/test_auth_expired_errors.py61CODE
LOWtests/unit/test_ci_test_matrix.py85CODE
LOWtests/unit/test_ci_test_matrix.py272CODE
LOWtests/unit/test_ci_selection_contracts.py48CODE
LOWtests/unit/test_ci_selection_contracts.py136CODE
LOWtests/unit/app/test_source_fallback.py162CODE
LOWtests/unit/app/test_source_fallback.py275CODE
LOWtests/unit/app/test_app_login_cookie.py371CODE
LOWtests/unit/cli/test_quiet_enforcement.py99CODE
LOWtests/unit/android/test_organization_adapters.py170CODE
LOWtests/_baselines/storage_transaction_policy.py17CODE
LOWtests/_baselines/module_size.py108CODE
LOWtests/_baselines/guardrail_literals.py54CODE
LOWtests/_guardrails/test_middleware_context_contract.py99CODE
LOW…drails/test_auth_web_bootstrap_compatibility_island.py110CODE
LOW…drails/test_auth_web_bootstrap_compatibility_island.py193CODE
LOWtests/_guardrails/test_auth_phase12c_boundaries.py253CODE
LOWtests/_guardrails/test_auth_storage_lock_boundary.py116CODE
LOWtests/_guardrails/test_auth_cookie_filter_boundary.py91CODE
LOWtests/_guardrails/test_auth_cookie_filter_boundary.py139CODE
LOWtests/_guardrails/test_no_session.py60CODE
LOWtests/_guardrails/test_auth_credential_io_boundary.py114CODE
LOWtests/_guardrails/test_cli_boundary.py199CODE
LOWtests/_guardrails/test_cli_boundary.py230CODE
LOWtests/_guardrails/test_cli_boundary.py263CODE
LOWtests/_guardrails/test_cli_boundary.py364CODE
LOWtests/_guardrails/test_cli_boundary.py470CODE
LOWtests/_guardrails/test_cli_boundary.py586CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py482CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py942CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py992CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py2295CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py294CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py1067CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py1418CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py1455CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py77CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py1253CODE
348 more matches not shown…
Over-Commented Block417 hits · 362 pts
SeverityFileLineSnippetContext
LOW.pre-commit-config.yaml21 #COMMENT
LOWpyproject.toml41Issues = "https://github.com/teng-lin/notebooklm-py/issues"COMMENT
LOWREADME.md221COMMENT
LOWdeploy/README.md21# 1. One-time, on a machine with a browser — bootstrap the Google credential:COMMENT
LOWdeploy/docker-compose.build.yml1# Override: build the notebooklm-mcp image from THIS checkout instead of pullingCOMMENT
LOWdeploy/docker-compose.yml1# Remote notebooklm-mcp behind a tunnel. Pick ONE tunnel via a Compose profile:COMMENT
LOWdeploy/docker-compose.yml21 # out of the box once a stable release exists. Pin a specific release withCOMMENT
LOWdeploy/docker-compose.yml41 # Optional self-hosted OAuth (for claude.ai). Unset → bearer-only; set bothCOMMENT
LOWdeploy/docker-compose.yml61 # `${FASTMCP_STATELESS_HTTP:-}` injects an EMPTY string when unset, and FastMCP's pydanticCOMMENT
LOWdeploy/docker-compose.yml101 # `:-` not `:?` — Compose interpolates the WHOLE file before profile filtering,COMMENT
LOWtests/cassette_patterns.py221 remainder = bodyCOMMENT
LOWtests/cassette_patterns.py361 # The display-name escaped-literal scrubber reuses the existingCOMMENT
LOWtests/cassette_patterns.py421_EMAIL_PATTERN_BASE = (COMMENT
LOWtests/cassette_patterns.py461# Each entry is regex-escaped because some legitimate UI titles could inCOMMENT
LOWtests/cassette_patterns.py481# Anchoring strategy per shape:COMMENT
LOWtests/cassette_patterns.py501 r"aas_et/[A-Za-z0-9_\-]+",COMMENT
LOWtests/cassette_patterns.py541 )COMMENT
LOWtests/cassette_patterns.py561#COMMENT
LOWtests/cassette_patterns.py741# scrubber and detector both registry-derived closes that drift.COMMENT
LOWtests/cassette_patterns.py761 # on the allowlist (the ``LSID`` leak class), inside a response/requestCOMMENT
LOWtests/cassette_patterns.py781 # which does not itself re-match (idempotent).COMMENT
LOWtests/cassette_patterns.py821 # was missing from this list, so its value round-tripped unscrubbed into theCOMMENT
LOWtests/cassette_patterns.py841 # Double-encoded ``authuser%3D<email>`` form (issue #1368). When theCOMMENT
LOWtests/cassette_patterns.py941 ),COMMENT
LOWtests/cassette_patterns.py961 r"\1SCRUBBED_DRIVE_FILE_ID\2",COMMENT
LOWtests/cassette_patterns.py981 # The pattern requires the LITERAL escaped quotes (``\\"`` in regex,COMMENT
LOWtests/cassette_patterns.py1041# RUN inside arbitrary text. A cookie header is a ``;``-delimited run ofCOMMENT
LOWtests/cassette_patterns.py1161 # Standalone upload_id query parameter: value must be SCRUBBED_UPLOAD_ID.COMMENT
LOWtests/cassette_patterns.py1181)COMMENT
LOWtests/cassette_patterns.py1221# avatar URL detector (/ogw/ group). The pattern matchesCOMMENT
LOWtests/cassette_patterns.py1241# closes the ``JrWMbf`` gap.COMMENT
LOWtests/cassette_patterns.py1261# ``authuser%3D<email>`` redirect-param shape (issue #1368). Unlike theCOMMENT
LOWtests/cassette_patterns.py1301 ("Google API key", _DETECT_GOOGLE_API_KEY),COMMENT
LOWtests/cassette_patterns.py1321# field whose API key the name-anchored scrubbers skipped), and #1372 fixed aCOMMENT
LOWtests/cassette_patterns.py1341# quoted high-entropy scalar (a credential split across structural punctuation,COMMENT
LOWtests/cassette_patterns.py1361# * the canonical UUID shape (``8-4-4-4-12`` hex-with-dashes) — these areCOMMENT
LOWtests/cassette_patterns.py1601COMMENT
LOWtests/cassette_patterns.py1621 # --- 9. Google API-key shape (field-name-agnostic) ---------------------COMMENT
LOWtests/cassette_patterns.py1641# =============================================================================COMMENT
LOWtests/vcr_config.py361# matcher's intent is to catch **structural** drift (different RPC id, differentCOMMENT
LOWtests/vcr_config.py781COMMENT
LOWtests/vcr_config.py801 if len(c1) >= 5:COMMENT
LOWtests/vcr_config.py821COMMENT
LOWtests/vcr_config.py861# Register custom matcher for rpcids-based request differentiationCOMMENT
LOWtests/unit/test_vcr_config.py381#COMMENT
LOWtests/unit/conftest.py41 """COMMENT
LOWtests/unit/conftest.py61 # wrapper's ``aiter_bytes`` + rebuild path works on it. Returning aCOMMENT
LOWtests/unit/test_check_rpc_health.py861 # stringifies to "" and must surface as the class name, not be swallowed.COMMENT
LOWtests/unit/test_check_rpc_health.py1281 assert rc == 0COMMENT
LOWtests/unit/test_public_api_behavior.py81# ---------------------------------------------------------------------------COMMENT
LOWtests/unit/test_cassette_sanitizer.py721 if line.strip() and not line.strip().startswith("#")COMMENT
LOWtests/unit/test_cassette_sanitizer.py741 # With all cassette repairs landed, this loop has nothing to assert;COMMENT
LOWtests/unit/test_exceptions.py341 with pytest.raises(SourceError):COMMENT
LOWtests/unit/test_artifact_downloads_coverage.py561 # out to the temp-file cleanup, keeping the assertion on the originalCOMMENT
LOWtests/unit/test_auth_cookie_save_race.py1761 # rather than monkeypatching ``notebooklm._core.save_cookies_to_storage``.COMMENT
LOWtests/unit/test_auth_cookie_save_race.py1781 if len(submitted) == 2:COMMENT
LOWtests/unit/test_user_settings_api.py141# ---------------------------------------------------------------------------COMMENT
LOWtests/unit/test_scripts_auth_cookie_domains.py401# Everything above pins the *auth* path. The three probe request paths -- twoCOMMENT
LOWtests/unit/test_atomic_update_json.py421COMMENT
LOWtests/unit/test_rpc_health_coverage.py61# ---------------------------------------------------------------------------COMMENT
357 more matches not shown…
Cross-File Repetition68 hits · 340 pts
SeverityFileLineSnippetContext
HIGHtests/unit/test_auth_cookie_policy.py0tests for auth token refresh and fetch_tokens (split in d1 pr-2). this file owns one concern from the auth subpackage. tSTRING
HIGHtests/unit/test_auth_storage.py0tests for auth token refresh and fetch_tokens (split in d1 pr-2). this file owns one concern from the auth subpackage. tSTRING
HIGHtests/unit/test_auth_refresh.py0tests for auth token refresh and fetch_tokens (split in d1 pr-2). this file owns one concern from the auth subpackage. tSTRING
HIGHtests/unit/cli/test_artifact.py0path a: uuid-shaped id skips partial-resolve; backend none → exit 1.STRING
HIGHtests/unit/cli/test_source.py0path a: uuid-shaped id skips partial-resolve; backend none → exit 1.STRING
HIGHtests/unit/cli/test_note.py0path a: uuid-shaped id skips partial-resolve; backend none → exit 1.STRING
HIGHtests/unit/cli/test_artifact.py0path a under ``--json``: typed json error doc + exit 1.STRING
HIGHtests/unit/cli/test_source.py0path a under ``--json``: typed json error doc + exit 1.STRING
HIGHtests/unit/cli/test_note.py0path a under ``--json``: typed json error doc + exit 1.STRING
HIGHtests/unit/cli/test_artifact.py0path b: partial-resolve succeeds, backend get() returns none → exit 1.STRING
HIGHtests/unit/cli/test_source.py0path b: partial-resolve succeeds, backend get() returns none → exit 1.STRING
HIGHtests/unit/cli/test_note.py0path b: partial-resolve succeeds, backend get() returns none → exit 1.STRING
HIGHtests/unit/android/test_source_writes.py0declare unowned child scheduling for direct transport tests.STRING
HIGHtests/unit/android/test_source_search.py0declare unowned child scheduling for direct transport tests.STRING
HIGHtests/unit/android/test_notebook_mutations.py0declare unowned child scheduling for direct transport tests.STRING
HIGHtests/unit/android/test_source_commit_paths.py0declare unowned child scheduling for direct transport tests.STRING
HIGHtests/_guardrails/test_server_classify_consistency.py0exactly one exemplar per category, so the parametrization is exhaustive.STRING
HIGHtests/_guardrails/test_mcp_classify_consistency.py0exactly one exemplar per category, so the parametrization is exhaustive.STRING
HIGH…_guardrails/test_classify_error_handler_consistency.py0exactly one exemplar per category, so the parametrization is exhaustive.STRING
HIGH…ts/integration/test_artifact_generation_idempotency.py0open a real lifecycle generation, then install the mock transport.STRING
HIGHtests/integration/test_research_idempotency.py0open a real lifecycle generation, then install the mock transport.STRING
HIGHtests/integration/test_side_effects_idempotency.py0open a real lifecycle generation, then install the mock transport.STRING
HIGHtests/integration/test_notes_idempotency.py0open a real lifecycle generation, then install the mock transport.STRING
HIGH…ts/integration/test_artifact_generation_idempotency.py0extract the ``rpcids=`` query param from a batchexecute request url.STRING
HIGHtests/integration/test_research_idempotency.py0extract the ``rpcids=`` query param from a batchexecute request url.STRING
HIGHtests/integration/test_side_effects_idempotency.py0extract the ``rpcids=`` query param from a batchexecute request url.STRING
HIGHtests/integration/test_notes_idempotency.py0extract the ``rpcids=`` query param from a batchexecute request url.STRING
HIGH…sts/integration/concurrency/test_note_create_cancel.py0extract the ``rpcids=`` query param from a batchexecute request url.STRING
HIGHtests/integration/test_settings_integration.py0integration tests for sharingapi. moved from ``tests/unit/`` to ``tests/integration/``. mock-backed (``pytest_httpx``); STRING
HIGHtests/integration/test_notes_integration.py0integration tests for sharingapi. moved from ``tests/unit/`` to ``tests/integration/``. mock-backed (``pytest_httpx``); STRING
HIGHtests/integration/test_notebooks_integration.py0integration tests for sharingapi. moved from ``tests/unit/`` to ``tests/integration/``. mock-backed (``pytest_httpx``); STRING
HIGHtests/integration/test_sharing_integration.py0integration tests for sharingapi. moved from ``tests/unit/`` to ``tests/integration/``. mock-backed (``pytest_httpx``); STRING
HIGHtests/integration/test_chat_delete_conversation_vcr.py0decode the form-encoded ``f.req`` body into its param list.STRING
HIGHtests/integration/test_notebooks_suggest_prompts_vcr.py0decode the form-encoded ``f.req`` body into its param list.STRING
HIGHtests/integration/test_research_discover_vcr.py0decode the form-encoded ``f.req`` body into its param list.STRING
HIGHtests/integration/test_research_cancel_vcr.py0decode the form-encoded ``f.req`` body into its param list.STRING
HIGHtests/integration/test_chat_delete_conversation_vcr.py0delete the scratch notebook. best-effort — failures are logged, not raised.STRING
HIGHtests/integration/test_research_discover_vcr.py0delete the scratch notebook. best-effort — failures are logged, not raised.STRING
HIGHtests/integration/test_research_cancel_vcr.py0delete the scratch notebook. best-effort — failures are logged, not raised.STRING
HIGHtests/integration/cli_vcr/test_generate.py0cli integration tests for note commands. these tests exercise the full cli → client → rpc path using vcr cassettes.STRING
HIGHtests/integration/cli_vcr/test_downloads.py0cli integration tests for note commands. these tests exercise the full cli → client → rpc path using vcr cassettes.STRING
HIGHtests/integration/cli_vcr/test_notes.py0cli integration tests for note commands. these tests exercise the full cli → client → rpc path using vcr cassettes.STRING
HIGH…ipts/_live_auth_scenarios/sibling_concurrent_reload.py0entry point for ``python -m`` execution by the live-auth matrix.STRING
HIGHscripts/_live_auth_scenarios/rest_recovery.py0entry point for ``python -m`` execution by the live-auth matrix.STRING
HIGHscripts/_live_auth_scenarios/mcp_recovery.py0entry point for ``python -m`` execution by the live-auth matrix.STRING
HIGHscripts/_live_auth_scenarios/browser_refresh.py0entry point for ``python -m`` execution by the live-auth matrix.STRING
HIGHscripts/_live_auth_scenarios/master_token_recovery.py0entry point for ``python -m`` execution by the live-auth matrix.STRING
HIGHsrc/notebooklm/_sharing.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_research.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_notes.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_chat.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_sources.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_settings.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_notebooks.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_collections.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_artifacts.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_mind_maps_api.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_labels.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_web/artifacts.py0return the backend's scope for one multi-call workflow.STRING
HIGHsrc/notebooklm/_artifacts.py0revise an individual slide in a completed slide deck using a prompt.STRING
8 more matches not shown…
Excessive Try-Catch Wrapping263 hits · 267 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py417 except Exception:CODE
LOWtests/conftest.py515 except Exception:CODE
LOWtests/_helpers/android_grpc_harness.py186 except Exception as cleanup_error: # noqa: BLE001 - reported, not hiddenCODE
LOWtests/_helpers/android_grpc_cassette.py924 except Exception as error: # noqa: BLE001 - diagnostics must never mask the mismatchCODE
LOWtests/unit/test_windows_compatibility.py312 except Exception as e:CODE
LOWtests/unit/mcp/conftest.py96 except Exception as exc: # noqa: BLE001 - scripted per-item outcomeCODE
LOWtests/unit/cli/test_cli_mcp_parity.py182 except Exception as exc: # noqa: BLE001 - caller classifies (see _mcp_capture)CODE
LOWtests/unit/concurrency/test_close_cancellation_leak.py370 except Exception:CODE
LOW…sts/_guardrails/test_mcp_lazy_client_error_boundary.py221 except Exception:CODE
LOW…sts/_guardrails/test_mcp_lazy_client_error_boundary.py233 except Exception:CODE
LOW…sts/_guardrails/test_mcp_lazy_client_error_boundary.py245 except Exception:CODE
LOW…sts/_guardrails/test_mcp_lazy_client_error_boundary.py257 except Exception:CODE
LOW…sts/_guardrails/test_mcp_lazy_client_error_boundary.py268 except Exception:CODE
MEDIUM…sts/_guardrails/test_mcp_lazy_client_error_boundary.py207def route(request):CODE
MEDIUM…sts/_guardrails/test_mcp_lazy_client_error_boundary.py230def route(request):CODE
MEDIUM…sts/_guardrails/test_mcp_lazy_client_error_boundary.py242def route(request):CODE
MEDIUM…sts/_guardrails/test_mcp_lazy_client_error_boundary.py254def route(request):CODE
MEDIUM…sts/_guardrails/test_mcp_lazy_client_error_boundary.py265def tool(ctx):CODE
LOWtests/_guardrails/test_storage_transaction_ratchet.py227 except Exception:STRING
LOWtests/integration/test_android_grpc_cassette.py712 except Exception as cleanup_error: # noqa: BLE001 - reported, not hiddenCODE
LOWtests/integration/test_chat_delete_conversation_vcr.py139 except Exception as exc: # noqa: BLE001CODE
LOW⚡tests/integration/test_chat_session_control_vcr.py94 except Exception as exc: # noqa: BLE001 - best-effort live-record cleanupCODE
LOW⚡tests/integration/test_chat_multi_source_vcr.py272 except Exception as exc: # noqa: BLE001 — best-effort cleanupCODE
LOWtests/integration/test_chat_oversized_rejection_vcr.py144 except Exception: # noqa: BLE001 — best-effort scratch cleanupCODE
LOWtests/integration/test_research_discover_vcr.py113 except Exception as exc: # noqa: BLE001CODE
LOW…sts/integration/test_curl_cffi_cassette_conformance.py66 except Exception:CODE
LOWtests/integration/test_research_cancel_vcr.py152 except Exception as exc: # noqa: BLE001CODE
LOWtests/integration/concurrency/test_add_file_toctou.py235 except Exception: # noqa: BLE001 — defensiveCODE
LOWtests/server/fakes.py167 except Exception as exc: # noqa: BLE001 - scripted per-item outcomeCODE
LOWtests/scripts/setup-generation-notebook.py74 except Exception as exc: # noqa: BLE001 — top-level CLI surfaceCODE
LOWtests/scripts/check_cassettes_clean.py254 except Exception: # noqa: BLE001 - degrade to line-scan on any parse/read errorCODE
LOWtests/_fault_server/web_protocol.py165 except Exception as exc:CODE
LOWtests/_fault_server/web_workflows.py183 except Exception as exc: # exact public class asserted belowCODE
LOWtests/_fault_server/web_workflows.py270 except Exception as exc: # exact contract asserted after cleanupCODE
LOWtests/_fault_server/web_workflows.py315 except Exception as exc: # first operation remains settled after the later failureCODE
LOWtests/_fault_server/web_workflows.py356 except Exception as exc:CODE
LOWtests/_fault_server/web_workflows.py416 except Exception as exc:CODE
LOWtests/_fault_server/android_protocol.py86 except Exception as exc:CODE
LOWtests/_fault_server/adapter_scenarios.py123 except Exception:CODE
LOWtests/_fault_server/web_slow_responses.py151 except Exception as exc:CODE
LOWtests/_fault_server/mcp_auth_startup_worker.py91 except Exception as error:CODE
MEDIUMtests/_fault_server/mcp_auth_startup_worker.py38def observe() -> None:CODE
LOWtests/_fault_server/web_saturation.py161 except Exception as exc:CODE
LOWtests/_fault_server/http.py559 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py333 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py362 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py377 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py392 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py409 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py519 except Exception as exc:CODE
LOWtests/_fault_server/web_scenarios.py539 except Exception as exc:CODE
MEDIUMtests/e2e/conftest.py153def _ask_with_skip(*args, **kwargs):CODE
LOW⚡tests/e2e/conftest.py1043 except Exception as e:CODE
LOW⚡tests/e2e/conftest.py1104 except Exception:CODE
LOW⚡tests/e2e/conftest.py1219 except Exception:CODE
LOW⚡tests/e2e/conftest.py1228 except Exception:CODE
LOW⚡tests/e2e/conftest.py1306 except Exception as e:CODE
LOW⚡tests/e2e/conftest.py1332 except Exception:CODE
LOW⚡tests/e2e/conftest.py1350 except Exception:CODE
LOW⚡tests/e2e/conftest.py1509 except Exception as e:CODE
203 more matches not shown…
Hallucination Indicators18 hits · 225 pts
SeverityFileLineSnippetContext
CRITICALtests/unit/test_browser_capture_session_candidate.py1265 browser.context.request.get.return_value.dispose.assert_called_once_with()CODE
CRITICAL⚡tests/unit/mcp/test_studio.py1494 assert mock_client.artifacts.download_quiz.await_args.kwargs.get("output_format") == "markdown"CODE
CRITICALtests/unit/cli/test_generate.py865 mock_client.mind_maps.generate.await_args.kwargs.get("instructions")CODE
CRITICALtests/unit/cli/test_resolver_characterization.py400 passed_conv_id = mock_client.chat.ask.await_args.kwargs.get("conversation_id")CODE
CRITICAL⚡tests/unit/android/test_artifact_outputs.py377 table = projection.table.document.body.content.add().tableCODE
CRITICAL⚡tests/unit/android/test_artifact_outputs.py408 projection.table.document.body.content.add().table.table_rows.add()CODE
CRITICAL⚡tests/unit/android/test_artifact_outputs.py428 table = projection.table.document.body.content.add().tableCODE
CRITICALtests/unit/android/test_artifact_outputs.py441 table = projection.table.document.body.content.add().tableCODE
CRITICALtests/unit/android/test_artifact_outputs.py455 table = projection.table.document.body.content.add().tableCODE
CRITICAL⚡tests/unit/android/test_artifacts.py1587 structural = raw.tailored_report.report_doc.body.content.add(start_index=0, end_index=12)CODE
CRITICAL⚡tests/unit/android/test_artifacts.py1591 bullet = raw.tailored_report.report_doc.body.content.add()CODE
CRITICAL⚡tests/unit/android/test_artifacts.py1595 rule = raw.tailored_report.report_doc.body.content.add()CODE
CRITICAL⚡tests/unit/android/test_artifacts.py1597 table = raw.tailored_report.report_doc.body.content.add().tableCODE
CRITICALtests/unit/android/test_artifacts.py1386 table = projection.table.document.body.content.add().tableCODE
CRITICALtests/unit/android/test_artifacts.py1412 table = projection.table.document.body.content.add().tableCODE
CRITICALtests/unit/android/test_artifacts.py1431 table = projection.table.document.body.content.add().tableCODE
CRITICALtests/unit/android/test_artifacts.py1447 table = projection.table.document.body.content.add().tableCODE
CRITICALtests/integration/test_vcr_example.py82 # Simulate the request format from notebooklm._web.transport.executor.RpcExecutor.rpc_call()COMMENT
Modern AI Meta-Vocabulary41 hits · 108 pts
SeverityFileLineSnippetContext
MEDIUMtests/unit/test_concurrency_refresh_race.py82# Test-side deadline for any single asyncio.Event in the race scaffolding.COMMENT
MEDIUMtests/unit/test_concurrency_refresh_race.py542 # Build the same auth scaffold the unit conftest's ``make_core`` producesCOMMENT
MEDIUM⚡tests/unit/test_check_rpc_health.py710# The streamed-chat orchestration RPC has no obfuscated method ID to echo backCOMMENT
MEDIUM⚡tests/unit/test_drive_import.py458# DriveImportService — orchestration, cleanup, second defenseCOMMENT
MEDIUMtests/unit/test_audit_auth_patch_sites.py63# string-target patch — and it correctly trips both ADR-0007 guardrailsCOMMENT
MEDIUMtests/unit/test_rpc_health_coverage.py134# without re-introducing the whole skip-list scaffolding.COMMENT
MEDIUM⚡tests/unit/test_chat_transport.py45# Test scaffoldingCOMMENT
MEDIUM⚡tests/unit/app/test_app_source_clean.py249# prepare / skip / execute orchestrationCOMMENT
MEDIUMtests/_guardrails/test_cli_boundary.py378 # facade or app orchestration, never ``_browser``.COMMENT
MEDIUMtests/_guardrails/_wire_contract.py52#: which lives in its own package rather than the ``orchestration.v1`` wire section.COMMENT
MEDIUMtests/_guardrails/_wire_contract.py69#: orchestration account envelope.COMMENT
MEDIUMtests/cassettes/web/cli_notebook_create.yaml2158 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505574,851569000],[\\\"0fCODE
MEDIUMtests/cassettes/web/cli_notebook_create.yaml2159 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505614,213638000],[\\\"10CODE
MEDIUMtests/cassettes/web/sources_transfer_lifecycle.yaml2364 Authorization (ID-JAG) - Descope Documentation\\\",[null,692,[1784352296,728922000],[\\\"00000000-0000-4000-8000CODE
MEDIUMtests/cassettes/web/workflow_tracer_bullet.yaml2086 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505574,851569000],[\\\"0fCODE
MEDIUMtests/cassettes/web/workflow_tracer_bullet.yaml2087 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505614,213638000],[\\\"10CODE
MEDIUMtests/cassettes/web/cli_notebook_list.yaml2158 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505574,851569000],[\\\"0fCODE
MEDIUMtests/cassettes/web/cli_notebook_list.yaml2159 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505614,213638000],[\\\"10CODE
MEDIUMdocs/architecture.md766#### Evidence and guardrailsCOMMENT
MEDIUMdocs/architecture.md786[guardrail map](https://teng-lin.github.io/notebooklm-py/diagrams/22-testing-and-guardrails.html)CODE
MEDIUMdocs/architecture.md1605The [testing and guardrails view](https://teng-lin.github.io/notebooklm-py/diagrams/22-testing-and-guardrails.html) mapsCODE
MEDIUMdocs/architecture.md2163│ ├── login_browser.py # Markup-free browser-login plan/orchestration: conflict validation, path preparation, CODE
MEDIUMdocs/architecture.md2164│ ├── login_cookie.py # Click-free login/cookie-import operations: request validation, browser-jar probing, aCODE
MEDIUMdocs/architecture.md2182│ ├── source_clean.py # Click-free `source clean` core: junk-source classification + batched-deletion orchestCODE
MEDIUMdocs/architecture.md2372│ └── lifecycle.py # Root lifecycle waves + phased transport orchestrationCODE
MEDIUMdocs/architecture.md2415├── _chat.py # Abstract ChatAPI + shared ask/configure/settings/turn-count orchestration over typed CODE
MEDIUMdocs/development.md31the [testing/guardrails map](https://teng-lin.github.io/notebooklm-py/diagrams/22-testing-and-guardrails.html)CODE
MEDIUMdocs/development.md67├── _chat.py # Backend-neutral ChatAPI orchestrationCODE
MEDIUMdocs/adr/0013-composable-session-capabilities.md263- **C-Z. AST-based delegate-surface regression guard** *(historical)* — introduced by PR [#885](https://github.com/teng-CODE
MEDIUMdocs/adr/0013-composable-session-capabilities.md263- **C-Z. AST-based delegate-surface regression guard** *(historical)* — introduced by PR [#885](https://github.com/teng-CODE
MEDIUMdocs/adr/0014-feature-local-runtime-adapters.md231### Rule 4 — `Session` retains only orchestration plus the documented middleware-chain seamsCOMMENT
MEDIUMdocs/adr/0036-browser-acquisition-package.md1# ADR-0036: Browser acquisition package and neutral login orchestrationCOMMENT
MEDIUMdocs/diagrams/README.md82| 22 | Test infrastructure | How do unit tests, guardrails, replay, real-loopback faults, and live tests fit into CI? | CODE
MEDIUM⚡docs/diagrams/22-testing-and-guardrails.html4963 <script id="archify-source-evidence-data" type="application/json">{"schemaVersion":1,"verified":true,"repository":{"CODE
MEDIUM⚡docs/diagrams/22-testing-and-guardrails.html4963 <script id="archify-source-evidence-data" type="application/json">{"schemaVersion":1,"verified":true,"repository":{"CODE
MEDIUMdocs/android/proto-evidence-ledger.md351`#7`. The cumulative orchestration service admits all four Notes signatures. The generatedCODE
MEDIUMdocs/android/proto-evidence-ledger.md886| `orchestration.v1.UploadFileRequest` | `project_id #3`, `request_context #4`, `source_id #5`, `provenance #6` | exact CODE
MEDIUMscripts/check_rpc_health.py2298 # Probe the streamed-chat orchestration RPC. It is not anCOMMENT
MEDIUMsrc/notebooklm/_artifacts.py662 # is used by first-party orchestration; routing legacy calls throughCOMMENT
MEDIUMsrc/notebooklm/_android/sharing.py28# through the orchestration service's generic project mutator -- seeCOMMENT
MEDIUMsrc/notebooklm/_web/params/notebooks.py85# what the backend RETURNS for each mode. ``5`` critique / ``6`` debate scaffolding /COMMENT
AI Slop Vocabulary27 hits · 84 pts
SeverityFileLineSnippetContext
MEDIUMtests/cassette_patterns.py214 # fixed number of characters) is robust to alternate-length prefixes ifCOMMENT
MEDIUMtests/vcr_config.py366# matcher robust across recording sessions while still failing on meaningfulCOMMENT
MEDIUMtests/vcr_config.py810 # or extra non-volatile dict keys — while staying robust against leafCOMMENT
MEDIUM⚡tests/unit/test_json_stdout_purity.py571# so the mock-client harness can't drive them. The parametrized sweepCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py950 # the mock-client harness. `notebook_create` goes through the standardCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py980 # harness — they read NOTEBOOKLM_HOME directly. Stage a clean layoutCOMMENT
MEDIUMtests/unit/test_auth_cookie_save_race.py1806 # order) to stay robust across schedulers.COMMENT
MEDIUM⚡tests/unit/test_row_adapters.py1367 # TZ-robust: compare the round-tripped epoch, not a wall-time string.COMMENT
MEDIUM⚡tests/unit/test_json_error_exit.py810 # then invoke without the mock-client harness (these commands don'tCOMMENT
MEDIUMtests/unit/test_json_error_exit.py785# Filesystem-driven failure cases bypass the mock-client harness — theyCOMMENT
MEDIUMtests/unit/test_sources_upload_delegation.py55 # parse bytecode. ``casefold()`` makes the suffix check robust onCOMMENT
MEDIUMtests/unit/test_rpc_golden_payloads.py1359# Wiring those would require contorting the harness or adding production codeCOMMENT
MEDIUM⚡tests/unit/test_vcr_body_matcher.py293# Volatile-key stripping — keep matching robust across recording timestampsCOMMENT
MEDIUMtests/unit/cli/test_login.py373 # rebuilding this harness.COMMENT
MEDIUMtests/_guardrails/test_no_pinned_cassette_values.py170# allow-listing the comparison methods) keeps the gate robust as newCOMMENT
MEDIUMtests/integration/concurrency/test_harness_smoke.py50# concurrency-harness smoke tests against a mock transport; noCOMMENT
MEDIUMtests/integration/concurrency/test_harness_smoke.py139 # Peak in-flight was high — the harness is genuinely fanning out.COMMENT
MEDIUM…ts/integration/concurrency/test_max_concurrent_rpcs.py71# concurrency-harness tests against a mock transport; no HTTP,COMMENT
MEDIUM…ts/integration/concurrency/test_max_concurrent_rpcs.py156 # Anything <= 8 would mean the gate isn't kicking in (the harnessCOMMENT
MEDIUMtests/integration/mcp_vcr/test_research.py61# recorded poll (the "Python programming best practices" task). Pinning it makesCOMMENT
MEDIUMtests/scripts/generate_relevance_ledger.py417 """Inspect all guardrail and historical files and build comprehensive relevance ledger."""STRING
MEDIUMtests/e2e/test_cli_live.py64 # or an enveloped object so the test is robust to the exact shape.COMMENT
MEDIUM⚡tests/e2e/test_research_import_verification.py93 # makes this path robust for fast-mode imports too.COMMENT
MEDIUMtests/e2e/_collection_candidate.py109 # The exact full name is the test-harness ownership boundary. TheCOMMENT
MEDIUM⚡docs/diagrams/22-testing-and-guardrails.html4963 <script id="archify-source-evidence-data" type="application/json">{"schemaVersion":1,"verified":true,"repository":{"CODE
MEDIUMsrc/notebooklm/_atomic_io.py413 # and re-introduce the divergent-lock race. ``casefold`` is the robustCOMMENT
LOWsrc/notebooklm/_web/sharing.py261 # Fetch current status and override view_level with what we just setCOMMENT
Fake / Example Data80 hits · 81 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_storage_writer.py538 (storage_mod.AccountRecord(7, "user@example.com"), "set", 7, "user@example.com"),CODE
LOW⚡tests/unit/test_auth_credential_io.py104 "email": "user@example.com",CODE
LOW⚡tests/unit/test_auth_credential_io.py112 '{\n "version": 1,\n "email": "user@example.com",\n'CODE
LOWtests/unit/test_app_master_token.py69 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py118 plan = app.MasterTokenLoginPlan("user@example.com", storage, "android", False)CODE
LOWtests/unit/test_app_master_token.py134 assert calls[0][1] == {"email": "user@example.com", "storage_path": storage, "force": False}CODE
LOWtests/unit/test_app_master_token.py138 "email": "user@example.com",CODE
LOWtests/unit/test_app_master_token.py157 app.MasterTokenLoginPlan("user@example.com", storage, None, True),CODE
LOWtests/unit/test_app_master_token.py185 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py212 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py250 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py549 account_email="user@example.com",CODE
LOWtests/unit/test_auth_profile_store_account.py55 ({"authuser": 3, "email": " user@example.com "}, ProfileAccount(3, "user@example.com")),CODE
LOW⚡tests/unit/test_cassette_sanitizer.py565 fake_key = "AIza" + "Z" * 35CODE
LOW⚡tests/unit/test_cassette_sanitizer.py568 (examples / "leak.json").write_text(f'{{"JrWMbf":"{fake_key}"}}\n', encoding="utf-8")CODE
LOW⚡tests/unit/test_chat_ask_invariants.py180 account_email="user@example.com",CODE
LOWtests/unit/test_chat_ask_invariants.py201 assert _extract_query_param(str(request.url), "authuser") == "user@example.com"CODE
LOWtests/unit/test_public_decoder_deprecations.py55 lambda: SharedUser.from_api_response(["user@example.com", 1]),CODE
LOWtests/unit/test_public_decoder_deprecations.py56 lambda: decode_shared_user(SharedUser, ["user@example.com", 1]),CODE
LOW⚡tests/unit/test_artifact_generation_prompt.py102 raw = _row_with_prompt(ArtifactTypeCode.AUDIO.value, 6, (1, 0), prompt="placeholder")CODE
LOW⚡tests/unit/test_token_regex.py47 assert value == "user@example.com"CODE
LOW⚡tests/unit/test_cassette_patterns.py285@pytest.mark.parametrize("placeholder", sorted(SCRUB_PLACEHOLDERS))CODE
LOW⚡tests/unit/test_sharing_types.py283 data = ["user@example.com", 3, [], ["Test User", "https://avatar.url"]]CODE
LOW⚡tests/unit/test_sharing_types.py286 assert user.email == "user@example.com"CODE
LOW⚡tests/unit/test_sharing_types.py310 data = ["user@example.com", 2, []]CODE
LOW⚡tests/unit/test_sharing_types.py313 assert user.email == "user@example.com"CODE
LOW⚡tests/unit/test_sharing_types.py320 data = ["user@example.com", 99, []]CODE
LOW⚡tests/unit/test_sharing_types.py327 data = ["user@example.com", {"permission": 3}, []]CODE
LOW⚡tests/unit/test_sharing_types.py373 data = ["user@example.com", 3, [], ["Just Name"]]CODE
LOW⚡tests/unit/test_sharing_types.py510 ["user@example.com", 3, [], ["Name", "https://avatar"]], # fullCODE
LOW⚡tests/unit/test_sharing_types.py511 ["user@example.com", 2, []], # minimal (no user_info slot)CODE
LOW⚡tests/unit/test_sharing_types.py512 ["user@example.com", 3, [], ["Just Name"]], # partial user_info (no avatar)CODE
LOW⚡tests/unit/test_sharing_types.py513 ["user@example.com", 99, []], # unknown permissionCODE
LOW⚡tests/unit/test_sharing_types.py514 ["user@example.com", {"k": 1}, []], # malformed (unhashable) permissionCODE
LOW⚡tests/unit/app/test_app_sharing.py129 "user@example.com",CODE
LOW⚡tests/unit/app/test_app_sharing.py139 "user@example.com",CODE
LOW⚡tests/unit/app/test_app_sharing.py159 "user@example.com",CODE
LOW⚡tests/unit/app/test_app_sharing.py166 "full_nb_part", "user@example.com", SharePermission.VIEWERCODE
LOW⚡tests/unit/app/test_app_sharing.py181 await execute_share_remove_user(client, "nb_1", "user@example.com")CODE
LOW⚡tests/unit/app/test_app_sharing.py183 client.sharing.remove_user.assert_awaited_once_with("nb_1", "user@example.com")CODE
LOW⚡tests/unit/cli/test_share.py176 ["share", "add", "user@example.com", "-n", "nb_123"],CODE
LOW⚡tests/unit/cli/test_share.py185 "user@example.com",CODE
LOW⚡tests/unit/cli/test_share.py206 ["share", "add", "user@example.com", "-n", "nb_123", "-p", "editor"],CODE
LOW⚡tests/unit/cli/test_share.py214 "user@example.com",CODE
LOW⚡tests/unit/cli/test_share.py242 ["share", "remove", "user@example.com", "-n", "nb_123", "-y"],CODE
LOW⚡tests/unit/cli/test_share.py248 mock_client.sharing.remove_user.assert_called_once_with("nb_123", "user@example.com")CODE
LOW⚡tests/unit/cli/test_share.py289 ["share", "remove", "user@example.com", "-n", "nb_123", "--json"],CODE
LOW⚡tests/unit/cli/test_share.py294 assert '"removed_user": "user@example.com"' in result.outputCODE
LOW⚡tests/unit/cli/test_share.py314 ["share", "remove", "user@example.com", "-n", "nb_123", "--json"],CODE
LOW⚡tests/unit/cli/test_share.py319 assert '"removed_user": "user@example.com"' in result.outputCODE
LOW⚡tests/unit/cli/test_share.py321 mock_client.sharing.remove_user.assert_called_once_with("nb_123", "user@example.com")CODE
LOW⚡tests/unit/cli/test_share.py487 assert '"updated_user": "user@example.com"' in result.outputCODE
LOW⚡tests/unit/cli/test_share.py663 ["share", "add", "user@example.com", "-n", "nb_123", "--json"],CODE
LOW⚡tests/unit/cli/test_share.py668 assert '"added_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py265 ["share", "remove", "user@example.com", "-n", "nb_123"],CODE
LOWtests/unit/cli/test_share.py447 ["share", "update", "user@example.com", "-n", "nb_123", "-p", "editor"],CODE
LOWtests/unit/cli/test_share.py455 "nb_123", "user@example.com", SharePermission.EDITORCODE
LOWtests/unit/cli/test_share.py476 "user@example.com",CODE
LOW⚡tests/unit/cli/test_session_characterization.py196 result = char_runner.invoke(cli, ["login", "--account", "user@example.com"])CODE
LOWtests/unit/cli/test_auth_refresh_cold_start.py62 "account": {"authuser": 0, "email": "user@example.com"},CODE
20 more matches not shown…
Structural Annotation Overuse33 hits · 62 pts
SeverityFileLineSnippetContext
LOW⚡tests/unit/test_cookie_domain_split.py612 # Step 2: storage_state → DomainCookieMap (used by AuthTokens).COMMENT
LOW⚡tests/unit/test_cookie_domain_split.py618 # Step 3: storage_state → httpx jar (used by downloads + refresh).COMMENT
LOW⚡tests/unit/test_cookie_domain_split.py626 # Step 4: the runtime gate itself accepts every YouTube variant.COMMENT
LOWtests/unit/test_cookie_domain_split.py601 # Step 1: rookiepy → storage_state conversion must keep the YouTubeCOMMENT
LOW⚡tests/integration/test_sources_integration.py800 # Step 1: Mock RPC registration response (o4cbdc)COMMENT
LOW⚡tests/integration/test_sources_integration.py809 # Step 2: Mock upload session start responseCOMMENT
LOW⚡tests/integration/test_sources_integration.py819 # Step 3: Mock upload finalize responseCOMMENT
LOW⚡tests/integration/test_sources_integration.py997 # Step 1: Mock RPC registrationCOMMENT
LOW⚡tests/integration/test_sources_integration.py1006 # Step 2: Mock upload session startCOMMENT
LOW⚡tests/integration/test_sources_integration.py1016 # Step 3: Mock upload finalizeCOMMENT
LOW⚡tests/integration/test_sources_integration.py2765 # Step 1: Successful RPC registrationCOMMENT
LOW⚡tests/integration/test_sources_integration.py2775 # Step 2: Upload session response WITHOUT the required upload URL headerCOMMENT
LOW⚡tests/e2e/test_research_import_verification.py43 # Step 1: Start fast web researchCOMMENT
LOWtests/e2e/test_research_import_verification.py57 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research_import_verification.py75 # Step 3: Get sources to importCOMMENT
LOW⚡tests/e2e/test_research_import_verification.py89 # Step 4: Import sources. Use the verification-aware variant so anCOMMENT
LOWtests/e2e/test_research_import_verification.py105 # Step 5: Poll for imported sources to appearCOMMENT
LOWtests/e2e/test_research_import_verification.py117 # Step 6: Verify source countCOMMENT
LOW⚡tests/e2e/test_research.py200 # Step 1: Start researchCOMMENT
LOWtests/e2e/test_research.py211 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research.py233 # Step 3: Import sources (if any found)COMMENT
LOW⚡docs/troubleshooting.md596# Step 1: Install bird (macOS/Linux)COMMENT
LOW⚡docs/troubleshooting.md599# Step 2: Fetch X.com content as markdownCOMMENT
LOW⚡docs/troubleshooting.md602# Step 3: Add the local markdown file to NotebookLMCOMMENT
LOWdocs/rpc-development.md269### Step 1: CaptureCOMMENT
LOWdocs/rpc-development.md278### Step 2: DecodeCOMMENT
LOWdocs/rpc-development.md296### Step 3: ImplementCOMMENT
LOWdocs/rpc-development.md345### Step 4: TestCOMMENT
LOWdocs/rpc-development.md379### Step 5: DocumentCOMMENT
LOWexamples/video.py26 # Step 1: Create a notebook with contentCOMMENT
LOW⚡examples/video.py45 # Step 2: Generate the video overviewCOMMENT
LOWexamples/video.py80 # Step 3: Wait for completion with status updatesCOMMENT
LOWexamples/video.py95 # Step 4: Download the videoCOMMENT
Verbosity Indicators25 hits · 48 pts
SeverityFileLineSnippetContext
LOW⚡tests/unit/test_cookie_domain_split.py612 # Step 2: storage_state → DomainCookieMap (used by AuthTokens).COMMENT
LOW⚡tests/unit/test_cookie_domain_split.py618 # Step 3: storage_state → httpx jar (used by downloads + refresh).COMMENT
LOW⚡tests/unit/test_cookie_domain_split.py626 # Step 4: the runtime gate itself accepts every YouTube variant.COMMENT
LOWtests/unit/test_cookie_domain_split.py601 # Step 1: rookiepy → storage_state conversion must keep the YouTubeCOMMENT
LOW⚡tests/integration/test_sources_integration.py800 # Step 1: Mock RPC registration response (o4cbdc)COMMENT
LOW⚡tests/integration/test_sources_integration.py809 # Step 2: Mock upload session start responseCOMMENT
LOW⚡tests/integration/test_sources_integration.py819 # Step 3: Mock upload finalize responseCOMMENT
LOW⚡tests/integration/test_sources_integration.py997 # Step 1: Mock RPC registrationCOMMENT
LOW⚡tests/integration/test_sources_integration.py1006 # Step 2: Mock upload session startCOMMENT
LOW⚡tests/integration/test_sources_integration.py1016 # Step 3: Mock upload finalizeCOMMENT
LOW⚡tests/integration/test_sources_integration.py2765 # Step 1: Successful RPC registrationCOMMENT
LOW⚡tests/integration/test_sources_integration.py2775 # Step 2: Upload session response WITHOUT the required upload URL headerCOMMENT
LOW⚡tests/e2e/test_research_import_verification.py43 # Step 1: Start fast web researchCOMMENT
LOWtests/e2e/test_research_import_verification.py57 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research_import_verification.py75 # Step 3: Get sources to importCOMMENT
LOW⚡tests/e2e/test_research_import_verification.py89 # Step 4: Import sources. Use the verification-aware variant so anCOMMENT
LOWtests/e2e/test_research_import_verification.py105 # Step 5: Poll for imported sources to appearCOMMENT
LOWtests/e2e/test_research_import_verification.py117 # Step 6: Verify source countCOMMENT
LOW⚡tests/e2e/test_research.py200 # Step 1: Start researchCOMMENT
LOWtests/e2e/test_research.py211 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research.py233 # Step 3: Import sources (if any found)COMMENT
LOWexamples/video.py26 # Step 1: Create a notebook with contentCOMMENT
LOW⚡examples/video.py45 # Step 2: Generate the video overviewCOMMENT
LOWexamples/video.py80 # Step 3: Wait for completion with status updatesCOMMENT
LOWexamples/video.py95 # Step 4: Download the videoCOMMENT
Self-Referential Comments16 hits · 43 pts
SeverityFileLineSnippetContext
MEDIUMtests/unit/test_artifact_downloads.py892 # Create the complex nested structure for data table.COMMENT
MEDIUM⚡tests/unit/test_sources_upload.py973 # Create a temp fileCOMMENT
MEDIUM⚡tests/unit/cli/test_resolve.py345 # Create a notebook with a short ID that we'll match exactlyCOMMENT
MEDIUMtests/unit/cli/test_source.py719 # Create a temp fileCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py811 # Create a test fileCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py901 # Create a source to deleteCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py939 # Create a notebook to deleteCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py971 # Create a note to deleteCOMMENT
MEDIUMtests/integration/test_android_grpc_cassette.py286 # Create the conversation inside the family so it re-records on its own.COMMENT
MEDIUMtests/e2e/test_artifacts.py246 # Create a quiz artifact for deletion (different type than flashcards)COMMENT
MEDIUMtests/e2e/test_sources.py123 # Create a source to deleteCOMMENT
MEDIUM⚡examples/notes.py49 # Create a new note with title and contentCOMMENT
MEDIUMexamples/notes.py27 # Create a notebook for our examplesCOMMENT
MEDIUMexamples/chat.py23 # Create a notebook with some contentCOMMENT
MEDIUMsrc/notebooklm/notebooklm_cli.py179 notebooklm create "My Notes" # Create a notebookSTRING
MEDIUMsrc/notebooklm/_browser/browser_capture.py1360 # Create a TEMPORARY page we own for the navigation, and close ONLYCOMMENT
AI Structural Patterns41 hits · 34 pts
SeverityFileLineSnippetContext
LOWtests/_helpers/client_factory.py32CODE
LOWtests/unit/test_logging_correlation.py244CODE
LOWtests/unit/test_auth_profile_store_minted.py37CODE
LOWtests/unit/test_e2e_collection_candidate.py23CODE
LOWtests/unit/test_rpc_executor.py91CODE
LOWtests/unit/test_rpc_executor.py276CODE
LOWtests/unit/test_rpc_executor.py924CODE
LOWtests/unit/test_idempotency_registry.py534CODE
LOWtests/unit/test_runtime_lifecycle.py115CODE
LOWtests/unit/test_rpc_golden_payloads.py1581CODE
LOWtests/unit/app/test_app_research.py41CODE
LOWtests/unit/cli/test_playwright_login_render_contract.py179CODE
LOWtests/unit/android/test_session.py229CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py1814CODE
LOWtests/_fault_server/web.py90CODE
LOWtests/_fault_server/android.py76CODE
LOWtests/_fault_server/web_scenarios.py142CODE
LOWsrc/notebooklm/_client_assembly.py132CODE
LOWsrc/notebooklm/client.py263CODE
LOWsrc/notebooklm/client.py688CODE
LOWsrc/notebooklm/_curl_cffi_transport.py234CODE
LOWsrc/notebooklm/_client_options.py283CODE
LOWsrc/notebooklm/exceptions.py497CODE
LOWsrc/notebooklm/_android/upload.py419CODE
LOWsrc/notebooklm/_android/session.py264CODE
LOWsrc/notebooklm/_android/session.py644CODE
LOWsrc/notebooklm/_android/session.py861CODE
LOWsrc/notebooklm/_auth/refresh.py712CODE
LOWsrc/notebooklm/mcp/tools/studio.py223CODE
LOWsrc/notebooklm/mcp/tools/sources.py617CODE
LOWsrc/notebooklm/cli/resolve.py199CODE
LOWsrc/notebooklm/_web/transport/runtime.py283CODE
LOWsrc/notebooklm/_web/transport/runtime.py315CODE
LOWsrc/notebooklm/_web/transport/init.py266CODE
LOWsrc/notebooklm/_web/transport/executor.py139CODE
LOWsrc/notebooklm/_web/transport/executor.py204CODE
LOWsrc/notebooklm/_web/transport/executor.py329CODE
LOWsrc/notebooklm/_web/sources/upload.py185CODE
LOWsrc/notebooklm/_source/polling.py123CODE
LOWsrc/notebooklm/_source/polling.py192CODE
LOWsrc/notebooklm/_app/generation_requests.py657CODE
Dead Code15 hits · 29 pts
SeverityFileLineSnippetContext
MEDIUMtests/unit/test_auth_remaining_branches.py873CODE
MEDIUMtests/unit/mcp/test_web_profiles.py295CODE
MEDIUMtests/unit/mcp/test_fileroutes.py1076CODE
MEDIUMtests/unit/mcp/test_stdio_source_add_roots.py101CODE
MEDIUMtests/unit/mcp/test_sources.py2048CODE
MEDIUMtests/unit/mcp/test_meta.py385CODE
MEDIUMtests/unit/mcp/test_meta.py411CODE
MEDIUMtests/unit/android/test_session_fake_server.py357CODE
MEDIUMtests/server/conftest.py67CODE
MEDIUMtests/server/test_app_lifecycle.py171CODE
MEDIUMtests/server/test_app_lifecycle.py223CODE
MEDIUMtests/server/test_app_lifecycle.py250CODE
MEDIUMtests/server/test_app_lifecycle.py275CODE
MEDIUMtests/server/test_sources.py120CODE
MEDIUMtests/server/test_meta.py206CODE
Synthetic Comment Markers3 hits · 26 pts
SeverityFileLineSnippetContext
HIGHdocs/python-api.md1310# Get AI-generated description (parsed with suggested topics)COMMENT
HIGHdocs/python-api.md1447# Get AI-generated summary and keywords (returns a typed SourceGuide)COMMENT
HIGH⚡examples/video.py51 # - CINEMATIC: AI-generated documentary footage (Veo 3)COMMENT
Overly Generic Function Names20 hits · 20 pts
SeverityFileLineSnippetContext
LOW⚡tests/unit/test_check_deprecation_targets.py637 "@decorate(_LAZY_EXPORTS)\ndef helper():\n pass",STRING
LOW⚡tests/unit/test_check_deprecation_targets.py638 "def helper(value=_LAZY_EXPORTS):\n pass",STRING
LOW⚡tests/unit/test_check_deprecation_targets.py639 "def helper() -> _LAZY_EXPORTS:\n pass",STRING
LOWtests/unit/test_check_deprecation_targets.py717 function = ast.parse("def helper():\n pass\n").body[0]STRING
LOW⚡tests/unit/test_audit_auth_patch_sites.py588 "def helper(monkeypatch, ATTR):\n"CODE
LOW⚡tests/unit/test_audit_auth_patch_sites.py599 "def helper(monkeypatch):\n"CODE
LOW⚡tests/unit/test_audit_auth_patch_sites.py609 body = "def helper(target):\n target.SEAM = 1\ndef test_x():\n helper(object())\n"CODE
LOW⚡tests/unit/test_audit_auth_patch_sites.py616 "def helper(monkeypatch, targets):\n"CODE
LOW⚡tests/unit/test_audit_auth_patch_sites.py627 "def helper(monkeypatch, targets):\n"CODE
LOWtests/unit/test_audit_auth_patch_sites.py527 "def helper(monkeypatch):\n"CODE
LOWtests/unit/test_audit_auth_patch_sites.py550 "def helper(mp, target):\n"CODE
LOWtests/unit/test_audit_auth_patch_sites.py572 "def helper(mp, target):\n"CODE
LOW⚡tests/unit/test_audit_auth_shared_mutations.py272 "def helper(monkeypatch, ATTR):\n"CODE
LOW⚡tests/unit/test_audit_auth_shared_mutations.py282 "def helper(target):\n"CODE
LOW⚡tests/unit/test_audit_auth_shared_mutations.py293 "def helper(monkeypatch, targets):\n"CODE
LOW⚡tests/unit/test_audit_auth_shared_mutations.py304 "def helper(targets):\n"CODE
LOWtests/unit/test_audit_auth_shared_mutations.py60 "def helper(monkeypatch):\n"CODE
LOWtests/unit/test_audit_auth_shared_mutations.py242 "def helper(mp, target):\n"CODE
LOWtests/unit/test_audit_auth_shared_mutations.py256 "def helper(mp, target):\n"CODE
LOWtests/unit/test_auth_behavior_scenario_policy.py303 "def helper(): pass\n"CODE
Redundant / Tautological Comments8 hits · 12 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_windows_compatibility.py261 # Check if UTF-8 mode is active (either via flag or env var)COMMENT
LOWtests/unit/test_auth_storage.py147 # Set NOTEBOOKLM_HOME to tmp_path and create a file thereCOMMENT
LOWtests/scripts/generate_relevance_ledger.py443 # Check if specific node rule existsCOMMENT
LOWtests/e2e/test_chat.py101 # Check if any references have cited_textCOMMENT
LOWscripts/check_rpc_health.py948 # Check if error response still contains our expected IDCOMMENT
LOWscripts/check_rpc_health.py965 # Check if expected ID is in responseCOMMENT
LOWsrc/notebooklm/_auth/cookie_policy.py903 # Check if it's a valid canonical Google domain (base or regional).COMMENT
LOWsrc/notebooklm/_app/chat.py198 # Check if the user switched notebooks via the --notebook flag. Only readCOMMENT