Repository Analysis

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.

32.6 Strong AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of teng-lin/notebooklm-py, a Python project with 18,987 GitHub stars. SynthScan v2.0 examined 747,603 lines of code across 1390 source files, recording 17763 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 32.6 places this repository in the Strong AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

32.6
Adjusted Score
32.6
Raw Score
100%
Time Factor
2026-08-28
Last Push
19.0K
Stars
Python
Language
747.6K
Lines of Code
1.4K
Files
17.8K
Pattern Hits
2026-08-29
Scan Date
0.17
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 4HIGH 235MEDIUM 2628LOW 14896

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 17763 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers11677 hits · 10312 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py353def pytest_collection_modifyitems(config, items):CODE
LOWtests/conftest.py515def mock_list_notebooks_response():STRING
LOWtests/conftest.py635def legacy_vcr_follow_up_probe(monkeypatch):STRING
LOWtests/conftest.py646 async def _count_prior_server_turns(STRING
LOWtests/conftest.py658def legacy_vcr_add_url_baseline(monkeypatch):CODE
LOWtests/cassette_patterns.py1579def synthetic_error_cassette_name(mode: str, slug: str) -> str:CODE
LOWtests/cassette_patterns.py1596def build_synthetic_error_response(CODE
LOWtests/vcr_config.py181def _substitute_synthetic_error(response: dict[str, Any]) -> dict[str, Any]:CODE
LOWtests/vcr_config.py502def _is_create_artifact_client_options(node: Any) -> bool:CODE
LOWtests/vcr_config.py518def _normalize_create_artifact_options(decoded_outer: Any) -> Any:CODE
LOWtests/_helpers/client_factory.py29def build_client_shell_for_tests(CODE
LOWtests/unit/test_artifacts_helpers.py30def test_extract_data_table_rows_happy_path() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py51def test_extract_data_table_rows_missing_inner_list() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py61def test_extract_data_table_rows_wrong_type_at_one_level() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py70def test_extract_data_table_rows_truncated_structure() -> None:CODE
LOWtests/unit/test_artifacts_helpers.py83def test_extract_data_table_rows_non_list_inner_value(CODE
LOWtests/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
LOWtests/unit/test_json_stdout_purity.py1238def test_matched_partial_id_goes_to_stderr_in_json_mode(runner: CliRunner, mock_auth_env) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py228 async def wait_for_research_completion(CODE
LOWtests/unit/test_json_stdout_purity.py326def _customize_suggest_prompts(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py339def _customize_share_view_level(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py343def _customize_source_fulltext(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py365def _customize_source_add_research(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py401def _customize_research_import(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py427def _customize_research_cancel(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py433def _customize_notebook_create(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py734def test_json_mode_stdout_is_parseable(CODE
LOWtests/unit/test_json_stdout_purity.py1138def test_all_json_commands_have_sweep_entry() -> None:CODE
LOWtests/unit/test_json_stdout_purity.py1257def test_matched_partial_id_still_goes_to_stdout_in_human_mode(CODE
LOWtests/unit/test_client_keepalive.py61async def _read_storage_text_when_available(storage_path):CODE
LOWtests/unit/test_client_keepalive.py71async def _wait_until_storage_contains(storage_path, needle: str, failure_message: str) -> None:CODE
LOWtests/unit/test_client_keepalive.py83async def _wait_for_rotate_requests(CODE
LOWtests/unit/test_client_keepalive.py104 async def test_keepalive_off_by_default(self, mock_auth, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py120 async def test_spawns_task_on_enter_cancels_on_exit(self, mock_auth, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py148 async def test_floor_clamps_low_interval(self, mock_auth):CODE
LOWtests/unit/test_client_keepalive.py158 async def test_floor_does_not_lower_higher_interval(self, mock_auth):CODE
LOWtests/unit/test_client_keepalive.py180 def test_rejects_non_positive_or_non_finite_keepalive(self, mock_auth, bad):CODE
LOWtests/unit/test_client_keepalive.py186 def test_rejects_non_positive_or_non_finite_floor(self, mock_auth, bad):CODE
LOWtests/unit/test_client_keepalive.py227 async def test_failure_does_not_crash_loop(self, mock_auth, httpx_mock: HTTPXMock, monkeypatch):CODE
LOWtests/unit/test_client_keepalive.py273 async def test_persistence_failure_logs_warning_and_continues(CODE
LOWtests/unit/test_client_keepalive.py321 async def test_explicit_storage_path_used_when_auth_lacks_one(CODE
LOWtests/unit/test_client_keepalive.py380 def test_explicit_storage_path_normalizes_onto_auth_without_mutating_caller(self, tmp_path):CODE
LOWtests/unit/test_client_keepalive.py412 async def test_close_persists_to_explicit_storage_path(self, tmp_path, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py448 async def test_persists_rotated_cookies_without_aexit(self, tmp_path, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py491 async def test_save_cookies_takes_in_process_lock_before_writing(self, tmp_path):CODE
LOWtests/unit/test_client_keepalive.py542 async def test_refresh_auth_routes_save_through_save_cookies(CODE
LOWtests/unit/test_client_keepalive.py626 def test_save_cookies_to_storage_acquires_file_lock(self, tmp_path, monkeypatch):CODE
LOWtests/unit/test_client_keepalive.py668 def test_save_cookies_to_storage_creates_lock_sentinel(self, tmp_path):CODE
LOWtests/unit/test_drain_tracker_hooks.py26async def test_run_drain_hooks_fires_in_registration_order() -> None:CODE
LOWtests/unit/test_drain_tracker_hooks.py54async def test_run_drain_hooks_continues_when_one_hook_raises(caplog) -> None:CODE
LOWtests/unit/test_drain_tracker_hooks.py93async def test_run_drain_hooks_is_noop_when_none_registered() -> None:CODE
LOWtests/unit/test_drain_tracker_hooks.py101async def test_register_drain_hook_overwrites_same_name() -> None:CODE
LOWtests/unit/test_chat_characterization.py1971 def test_parse_single_citation_returns_none_when_not_list(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1977 def test_parse_single_citation_returns_none_when_too_short(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1983 def test_parse_single_citation_returns_none_when_cite_inner_not_list(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1989 def test_parse_single_citation_returns_none_when_no_source_id(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py2139 def test_max_depth_zero_returns_none_with_warning(self, auth_tokens):CODE
11617 more matches not shown…
Decorative Section Separators2548 hits · 9729 pts
SeverityFileLineSnippetContext
MEDIUMtests/cassette_patterns.py721# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py723# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py730 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py732 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py757 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py759 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py766 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py768 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py776 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py778 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py785 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py787 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py862 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py864 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py874 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py876 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py894 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py896 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py901 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py903 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py1230# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1232# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1235# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py132# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py134# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py250# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py252# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py303# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py305# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py319# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py321# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py363# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py365# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py411# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py413# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py518# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py520# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py801 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py803 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py828 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py830 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py843 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py845 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py916 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py918 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py940 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py942 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py955# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py957# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1546# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1548# =============================================================================COMMENT
MEDIUMtests/vcr_config.py319# =============================================================================COMMENT
MEDIUMtests/vcr_config.py321# =============================================================================COMMENT
MEDIUMtests/vcr_config.py761# =============================================================================COMMENT
MEDIUMtests/vcr_config.py763# =============================================================================COMMENT
MEDIUMtests/unit/test_artifacts_helpers.py25# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/unit/test_artifacts_helpers.py27# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/unit/test_artifacts_helpers.py46# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/unit/test_artifacts_helpers.py48# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/unit/test_artifacts_helpers.py78# ---------------------------------------------------------------------------COMMENT
2488 more matches not shown…
Unused Imports1880 hits · 1504 pts
SeverityFileLineSnippetContext
LOWhatch_build.py21CODE
LOWdesktop-extension/run_server.py24CODE
LOWtests/cassette_patterns.py126CODE
LOWtests/_helpers/client_factory.py3CODE
LOWtests/unit/test_artifacts_helpers.py12CODE
LOWtests/unit/test_json_stdout_purity.py19CODE
LOWtests/unit/test_drain_tracker_hooks.py18CODE
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_storage_writer.py12CODE
LOWtests/unit/test_vcr_scrubbing.py30CODE
LOWtests/unit/test_auth_refresh_profile_store.py3CODE
LOWtests/unit/test_collection_exceptions.py3CODE
LOWtests/unit/test_auth_instance_invariant.py3CODE
LOWtests/unit/test_collections_api.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_auth_master_token.py7CODE
LOWtests/unit/test_tier_enforcement_hook.py39CODE
LOWtests/unit/test_auth_refresh_retry.py12CODE
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.py1010CODE
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_middleware_chain_host.py28CODE
LOWtests/unit/test_auth_cold_start_recovery.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_logging.py3CODE
LOWtests/unit/test_label_exceptions.py3CODE
LOWtests/unit/test_check_rpc_health.py23CODE
LOWtests/unit/test_auth_headless_reauth.py16CODE
LOWtests/unit/test_public_api_behavior.py40CODE
LOWtests/unit/test_refresh_state_machine.py14CODE
LOWtests/unit/test_download_redirect_revalidation.py25CODE
LOWtests/unit/test_timeout_composition.py23CODE
LOWtests/unit/test_logging_correlation.py3CODE
LOWtests/unit/test_auth_profile_store_minted.py3CODE
LOWtests/unit/test_download_result.py3CODE
LOWtests/unit/test_auth_master_token_file.py3CODE
LOWtests/unit/test_chat_passage_resolver.py16CODE
LOWtests/unit/test_auth_session_headless_reauth.py19CODE
LOWtests/unit/test_chat_helpers.py11CODE
LOWtests/unit/test_auth_psidts_recovery.py12CODE
LOWtests/unit/test_tracked_files.py3CODE
LOWtests/unit/test_idempotent_create_contract.py3CODE
LOWtests/unit/test_mind_maps_api.py3CODE
LOWtests/unit/test_error_injection_middleware.py41CODE
1820 more matches not shown…
Cross-Language Confusion117 hits · 670 pts
SeverityFileLineSnippetContext
HIGHtests/vcr_config.py572 1. **Streaming-chat envelope** ``[null, "<inner_json>"]`` where the innerSTRING
HIGHtests/vcr_config.py578 2. **Batchexecute envelope** ``[[[rpc_id, args_json, null, "generic"]]]``STRING
HIGHtests/vcr_config.py647 # Streaming-chat envelope: [null, "<inner_json>"].COMMENT
HIGHtests/unit/test_vcr_config.py84 JSON envelope is ``[null, "<inner_json>"]`` and ``<inner_json>`` is itself aSTRING
HIGHtests/unit/test_check_rpc_health.py928 body = ')]}\'\n\n[["wrb.fr","sqTeoe","null",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_check_rpc_health.py942 body = ')]}\'\n\n[["wrb.fr","sqTeoe","[[1,2,3]]",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_decoder.py1286 payload = f'[["wrb.fr","{self.RPC_ID}",null,null,null,{deep}]]'CODE
HIGHtests/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
HIGHtests/unit/test_sources_row_adapter.py854# 402x [null, 2] — no Drive-status slotCOMMENT
HIGHtests/unit/test_sources_row_adapter.py855# 4x [null, 2, null, 3] — Drive-backed, ACTIVECOMMENT
HIGHtests/unit/test_sources_row_adapter.py856# 3x [null, 2, [null,null,null,[]]] — a populated settings[2], no [3]COMMENT
HIGHtests/unit/test_sources_row_adapter.py684 """A live-shaped web-page row (``metadata[0]`` null, URL at ``[7]``) yields None.STRING
HIGHtests/unit/test_sources_row_adapter.py871 """settings ``[null, 2, null, 3]`` — the only populated shape seen live."""STRING
HIGHtests/unit/test_sources_row_adapter.py879 """settings ``[null, 2]`` — 402 of 409 live rows. No Drive claim at all."""STRING
HIGHtests/unit/test_sources_row_adapter.py886 """settings ``[null, 2, [null,null,null,[]]]`` — 3 of 409 live rows.STRING
HIGHtests/unit/test_collection_params.py93 # Owner capture: [ [null,null,null,[[nbid]]], [] ] with the type-3 tail.COMMENT
HIGHtests/unit/test_api_coverage.py150 # Real API returns 3 levels of nesting: [[[null, [summary], [[keywords]], []]]]COMMENT
HIGHtests/unit/test_api_coverage.py187 # Response format: [[[title, description, null, null, prompt, audience_level], ...]]COMMENT
HIGHtests/unit/test_api_coverage.py314 # Verify reference payload: [null, ["source_id"], [2]]COMMENT
HIGHtests/unit/test_api_coverage.py330 # Verify reference payload: [null, ["source_id"], [2]]COMMENT
HIGHtests/unit/test_authed_post_pipeline.py1598 decoded_payload = b')]}\'\n\n[["wrb.fr",null,"[1]",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_select_artifact.py277 ever emits ``[null, ...]`` at index 15 the sort must coerce thatSTRING
HIGHtests/unit/test_auth_cookie_save_race.py1031 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_user_settings_api.py145# GET_USER_SETTINGS inner: [[null,[..limits..],[true,null,null,true,["fr"]],COMMENT
HIGHtests/unit/test_user_settings_api.py147# SET_USER_SETTINGS inner: [null,[..limits..],[true,null,null,true,["en"]],COMMENT
HIGHtests/unit/test_rate_limit_retry.py47 resp.text = ")]}'\n[null,[" + str(payload).replace("'", '"') + "]]"CODE
HIGHtests/unit/test_rescrub_cassettes_script.py89 f'[["wrb.fr","JFMDGd","[[null,[\\"{avatar_url}\\"]]]",null,null,null,"generic"]]'CODE
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_rpc_overrides.py181 '{"LIST_NOTEBOOKS": null, "CREATE_NOTEBOOK": "valid"}',CODE
HIGHtests/unit/test_vcr_body_matcher.py117 """Build a streaming-chat ``f.req`` form body (`[null, "<inner_json>"]`)."""STRING
HIGHtests/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
HIGHtests/unit/test_chat_row_adapter.py402 # ``[None]`` (leading slot present but null) yields ``None`` — theCOMMENT
HIGHtests/unit/test_source_selection.py1078 # Response format: [[[title, description, null, null, prompt, audience_level], ...]]COMMENT
HIGHtests/unit/mcp/test_sources.py281 # ``status: Literal[...] | None`` serializes as an ``anyOf`` of {enum} + {null}.COMMENT
HIGHtests/unit/mcp/test_sources.py1902 {"source": null} as success — it projects NOT_FOUND."""STRING
HIGHtests/unit/mcp/test_uploadwidget.py75 assert "uploadUrls[i]=null;confirmUpload(tok)" in _WIDGET_HTMLCODE
HIGHtests/unit/cli/test_note.py578 CLI emitted ``{"id": null, "created": false, "error": "Creation maySTRING
HIGHtests/unit/cli/test_playwright_login_render_contract.py778 " 2. Or run: notebooklm auth logout && notebooklm login\n"CODE
HIGHtests/unit/cli/test_playwright_login_render_contract.py838 " 2. Or run: notebooklm auth logout && notebooklm login\n"CODE
HIGHtests/unit/cli/test_playwright_login_render_contract.py914 " 2. Or run: notebooklm auth logout && notebooklm login\n"CODE
HIGHtests/_guardrails/test_cassette_shapes.py397 f"[null, '<inner-json>'], got {type(freq).__name__} {freq!r:.120}"CODE
HIGHtests/_guardrails/test_cassette_shapes.py29the new 9-param outer shape ``[null, "<inner-json-string>"]`` whose innerSTRING
HIGHtests/_guardrails/test_cassette_shapes.py389 Real chat-ask `f.req` is ``[null, "<inner-json>"]`` whose inner JSONSTRING
HIGHtests/_guardrails/_wire_contract.py144 note="live-verified: settings=[null,2] decodes as status COMPLETE",CODE
HIGHtests/_guardrails/_wire_contract.py164 "Live: 4/409 source rows carry settings=[null,2,null,3] (all "CODE
HIGHtests/_guardrails/_wire_contract.py796 # [[<user rows>], null, 1000, true, null, null, [3, true, true], false]COMMENT
HIGHtests/_guardrails/_wire_contract.py877 "index 2 (tag 3) cannot exist on it. The `[null, true, [id]]` shape this "CODE
HIGHtests/_guardrails/test_golden_decode_coverage.py220 # ([] for web, [[null, true, [id]]] for drive) are pinned to ``is True``COMMENT
HIGHtests/integration/test_vcr_comprehensive.py853 # Drive sources return [[null, true, [source_id]]] when freshCOMMENT
HIGHtests/integration/test_vcr_comprehensive.py635 ``tests/vcr_config.py``), so ``[1, 3]``, ``[3, 1]`` and the ``[null,STRING
HIGHtests/integration/test_vcr_comprehensive.py636 null]`` this cassette actually recorded are indistinguishable to it.STRING
HIGHtests/integration/test_sources_idempotency.py108 ``[[id], title, [null, 28940, [ts, ns], [uuid, [ts, ns]], 5, null, 1, [url]], [null, 2]]``STRING
HIGHtests/integration/test_rpc_seam_matrix.py45 [[RPCMethod.LIST_NOTEBOOKS.value, "[null,1,null,[2]]", None, "generic"]]CODE
HIGHtests/integration/test_artifacts_integration.py2574 """An empty (non-null) CREATE_ARTIFACT result drifts and raises.STRING
57 more matches not shown…
Over-Commented Block477 hits · 416 pts
SeverityFileLineSnippetContext
LOW.pre-commit-config.yaml21 #COMMENT
LOWpyproject.toml41COMMENT
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/conftest.py141 # ``_LAST_POKE_ATTEMPT_MONOTONIC`` and ``_POKE_LOCKS_BY_LOOP`` are sharedCOMMENT
LOWtests/cassette_patterns.py341 # URL-encoded form for ``?authuser=`` query params. The provider-COMMENT
LOWtests/cassette_patterns.py361COMMENT
LOWtests/cassette_patterns.py421# extra level (``?``→``%3F``, ``=``→``%3D``, ``@``→``%40``) — issue #1368. BothCOMMENT
LOWtests/cassette_patterns.py441# Negative-lookahead alternation built from the false-positive allowlist.COMMENT
LOWtests/cassette_patterns.py461#COMMENT
LOWtests/cassette_patterns.py481COMMENT
LOWtests/cassette_patterns.py521# The name-anchored ``_cookie_header_replacer`` patterns above scrub only theCOMMENT
LOWtests/cassette_patterns.py721# =============================================================================COMMENT
LOWtests/cassette_patterns.py741 # values and OAuth flows.COMMENT
LOWtests/cassette_patterns.py761 # ``__Secure-*`` / ``__Host-*`` umbrellas — the prefix is distinctiveCOMMENT
LOWtests/cassette_patterns.py801 # -------------------------------------------------------------------------COMMENT
LOWtests/cassette_patterns.py821 # does not itself re-match (idempotent).COMMENT
LOWtests/cassette_patterns.py861 ),COMMENT
LOWtests/cassette_patterns.py881 "X-GUploader-UploadID: SCRUBBED_UPLOAD_ID",COMMENT
LOWtests/cassette_patterns.py901 # -------------------------------------------------------------------------COMMENT
LOWtests/cassette_patterns.py921 # ``[\"alice@gmail.com\",1,[],[\"First Last\",\"https://lh3...\"]]``.COMMENT
LOWtests/cassette_patterns.py1101)COMMENT
LOWtests/cassette_patterns.py1121 # Drive file ID in JSON key: ``"file_id": "<id>"``.COMMENT
LOWtests/cassette_patterns.py1141# directly.COMMENT
LOWtests/cassette_patterns.py1161# to the ``SCRUBBED_API_KEY`` sentinel (which does not contain the ``AIza``COMMENT
LOWtests/cassette_patterns.py1181# Detectors with ZERO legitimate-occurrence risk anywhere in the repository:COMMENT
LOWtests/cassette_patterns.py1201# key on, and the existing high-entropy scan only catches it when it happens toCOMMENT
LOWtests/cassette_patterns.py1221COMMENT
LOWtests/cassette_patterns.py1241# This is not hypothetical: the guard has missed two such shapes historicallyCOMMENT
LOWtests/cassette_patterns.py1261# achievable while still catching a planted novel token. This residual-riskCOMMENT
LOWtests/cassette_patterns.py1281#COMMENT
LOWtests/cassette_patterns.py1501 # --- 7. Avatar URLs ---------------------------------------------------COMMENT
LOWtests/cassette_patterns.py1521 # definition — this is the cookie-name-agnostic backstop that closes theCOMMENT
LOWtests/cassette_patterns.py1541 leaks.extend(find_high_entropy_leaks(text))COMMENT
LOWtests/vcr_config.py361# matcher's intent is to catch **structural** drift (different RPC id, differentCOMMENT
LOWtests/vcr_config.py721 # Streaming-chat: drop the volatile conversation_id at slot 4 andCOMMENT
LOWtests/vcr_config.py741 c2[4] = SENTINELCOMMENT
LOWtests/vcr_config.py761# =============================================================================COMMENT
LOWtests/vcr_config.py801# ``freq`` is wired into the default ``match_on`` tuple above. The matcherCOMMENT
LOWtests/unit/test_vcr_config.py361 assert out.startswith("<html>")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.py1661 assert captured["base_url_source"] == "--base-url"COMMENT
LOWtests/unit/test_sources_row_adapter.py841 assert "documentId" not in caplog.text, f"must not warn for {why}"COMMENT
LOWtests/unit/test_cassette_sanitizer.py581 allowlist = TESTS_DIR / "scripts" / "cassette_repair_allowlist.txt"COMMENT
LOWtests/unit/test_cassette_sanitizer.py601 # ``artifacts_revise_slide.yaml`` is NOT in this required-set anymoreCOMMENT
LOWtests/unit/test_exceptions.py341 with pytest.raises(SourceError):COMMENT
LOWtests/unit/test_authed_post_pipeline.py481 # Tightened signature pins the explicit-collaborator contract:COMMENT
LOWtests/unit/test_auth_storage.py621# COOKIE DOMAIN VALIDATION TESTSCOMMENT
LOWtests/unit/test_notebook_api.py381 # The message names what broke the baseline — otherwise nothing reaching theCOMMENT
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.py1721 # Explicit barrier: each coroutine records its submission and theCOMMENT
LOWtests/unit/test_auth_cookie_save_race.py1741COMMENT
LOWtests/unit/test_user_settings_api.py141# ---------------------------------------------------------------------------COMMENT
LOWtests/unit/test_scripts_auth_cookie_domains.py401# path rather than a method id -- were a separate leak: each hand-builtCOMMENT
417 more matches not shown…
Docstring Block Structure76 hits · 380 pts
SeverityFileLineSnippetContext
HIGHtests/cassette_patterns.py150Re-derive ``<count>`` prefixes in a chunked response body. Google's batchexecute responses are framed as alternatinSTRING
HIGHtests/cassette_patterns.py1599Return a ``(status_code, body, headers)`` triple for a synthetic error. The shape is intentionally minimal; the cliSTRING
HIGHsrc/notebooklm/_sharing.py39Share notebook with a user. Intent wrapper over :meth:`set_users`. The underlying operation is an upserSTRING
HIGHsrc/notebooklm/_notes.py46Get 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.py759Refresh authentication tokens by fetching the NotebookLM homepage. This helps prevent 'Session Expired' errors STRING
HIGHsrc/notebooklm/_idempotency.py142Probe-then-retry wrapper for mutating create RPCs. Args: create: Coroutine factory that issues the create RSTRING
HIGHsrc/notebooklm/_chat.py276Ask the notebook a question. Args: notebook_id: The notebook ID. question: The questionSTRING
HIGHsrc/notebooklm/_chat.py539Save a chat answer as a citation-rich note (issue #660). Unlike :meth:`NotesAPI.create`, this preserves the ``[STRING
HIGHsrc/notebooklm/_sources.py55Get details of a specific source. Args: notebook_id: The notebook ID. source_id: The soSTRING
HIGHsrc/notebooklm/_sources.py110Wait for a source to become ready. Polls until READY, terminal ERROR, or timeout. Configured transient STRING
HIGHsrc/notebooklm/_sources.py198Wait for a source to be registered server-side (status >= PROCESSING). Polls until the source is visible in theSTRING
HIGHsrc/notebooklm/_sources.py248Wait for multiple sources to become ready in parallel. Args: notebook_id: The notebook ID. 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.py77Run an artifact-generation callable with rate-limit retry. The callable is always invoked at least once. A retry isSTRING
HIGHsrc/notebooklm/_mind_maps_api.py164Rename 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.py236Extract Google cookies from Playwright storage state for NotebookLM auth. Filters through the canonical auth-domainSTRING
HIGHsrc/notebooklm/_auth/cookies.py370Load Playwright storage state from file or environment variable. This is a shared helper used by load_auth_from_stoSTRING
HIGHsrc/notebooklm/_auth/cookies.py451Load cookies as an httpx.Cookies object for authenticated downloads. Unlike load_auth_from_storage() which returns STRING
HIGHsrc/notebooklm/_auth/cookies.py491Extract Google cookies from storage state preserving original identity. Returns a path-aware ``(name, domain, path)STRING
HIGHsrc/notebooklm/_auth/cookies.py583Build an httpx.Cookies jar with original domains preserved. This function loads cookies from storage and creates a STRING
HIGHsrc/notebooklm/_auth/tokens.py268Return the ``Cookie:`` header this session would send to ``url``. .. deprecated:: 0.8.1 Scheduled foSTRING
HIGHsrc/notebooklm/_auth/tokens.py440Create AuthTokens from Playwright storage state file. Compatibility loader for callers that still need a standaSTRING
HIGHsrc/notebooklm/_auth/tokens.py805Load Google cookies from storage as a flat name→value dict. Loads authentication cookies with the following precedeSTRING
HIGHsrc/notebooklm/_auth/browser_capture.py1214Capture NotebookLM storage state by attaching to a running Chrome over CDP. An **alternative credential source** foSTRING
HIGHsrc/notebooklm/_auth/extraction.py83Extract a ``WIZ_global_data[key]`` value from a NotebookLM HTML response. NotebookLM (and other Google products) emSTRING
HIGHsrc/notebooklm/_auth/extraction.py386 Extract CSRF token (SNlM0e) from NotebookLM page HTML. The CSRF token is embedded in the page's WIZ_global_datSTRING
HIGHsrc/notebooklm/_auth/extraction.py429 Extract session ID (FdrFJe) from NotebookLM page HTML. The session ID is embedded in the page's WIZ_global_datSTRING
HIGHsrc/notebooklm/_auth/refresh.py938Internal: fetch CSRF and session tokens using a pre-built cookie jar. This is the single implementation for all tokSTRING
HIGHsrc/notebooklm/_auth/refresh.py1035Fetch tokens from a cookie mapping. For backward compatibility. Prefer NotebookLMClient.from_storage(), which preseSTRING
HIGHsrc/notebooklm/_auth/refresh.py1142Validate 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.py278Resolve a notebook reference (full/partial id, exact title, or unique title prefix) to its id. Args: clientSTRING
HIGHsrc/notebooklm/mcp/_resolve.py306Resolve a source reference within a notebook to its id. Args: client: The lifespan-bound client. noSTRING
HIGHsrc/notebooklm/mcp/_resolve.py337Resolve many source references within a notebook, listing sources at most once. The per-tool callers ``chat_ask`` /STRING
HIGHsrc/notebooklm/mcp/_resolve.py398Resolve a note reference within a notebook to its id. Same matching rules as :func:`resolve_source`, over the notebSTRING
HIGHsrc/notebooklm/mcp/_resolve.py429Resolve 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.py126Get notebook ID from argument, env var, or active context. Resolution order (env-var precedence): 1. ``notebooSTRING
HIGHsrc/notebooklm/cli/resolve.py207Resolve a partial ID against a **pre-fetched** item list. Sync core of the partial-ID matching logic. Encapsulates STRING
HIGHsrc/notebooklm/cli/resolve.py339Resolve 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.py86Probe ``?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.py189Set several users' permissions on a notebook in one request. This is an **upsert**, not an add: an email that iSTRING
HIGHsrc/notebooklm/_web/research.py289Start a research session. Args: notebook_id: The notebook ID. query: The research querySTRING
HIGHsrc/notebooklm/_web/research.py472Poll until research reaches a terminal state or times out. When the first poll returns a concrete ``task_id``, STRING
HIGHsrc/notebooklm/_web/notes.py521Get a specific note by ID. Args: notebook_id: The notebook ID. note_id: The note ID. STRING
HIGHsrc/notebooklm/_web/chat.py427Read the notebook's current chat configuration. Decodes the chat-settings block from ``GET_NOTEBOOK`` so a *parSTRING
HIGHsrc/notebooklm/_web/notebooks.py407Get AI-suggested prompts for a notebook. Backed by ``GeneratePromptSuggestions`` (``otmP3b``): a *general* STRING
HIGHsrc/notebooklm/_web/notebooks.py606Get 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
16 more matches not shown…
Modern Structural Boilerplate302 hits · 306 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_json_stdout_purity.py459def _setup_fs_doctor(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py488def _setup_fs_profile_list(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/test_auth_refresh_profile_store.py92def _set_live(live: httpx.Cookies, name: str, value: str) -> None:CODE
LOWtests/unit/test_auth_session_headless_reauth.py95 async def update_auth_tokens(self, *, auth: AuthTokens, csrf: str, session_id: str) -> None:CODE
LOWtests/unit/test_auth_session_headless_reauth.py124 def update_auth_headers(self, *, auth: AuthTokens, kernel: Any) -> None:CODE
LOWtests/unit/test_auth_cookie_save_race.py92def _set_cookie_value(jar: httpx.Cookies, name: str, value) -> None:CODE
LOWtests/unit/test_auth_session.py110 async def update_auth_tokens(self, *, auth: AuthTokens, csrf: str, session_id: str) -> None:CODE
LOWtests/unit/test_auth_session.py139 def update_auth_headers(self, *, auth: AuthTokens, kernel: Any) -> None:CODE
LOWtests/unit/test_auth_session_refresh_cmd.py67 async def update_auth_tokens(self, *, auth: AuthTokens, csrf: str, session_id: str) -> None:CODE
LOWtests/unit/test_auth_session_refresh_cmd.py72 def update_auth_headers(self, *, auth: AuthTokens, kernel: Any) -> 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.py211 def _setup(c: Any) -> None:CODE
LOWtests/unit/cli/test_cli_mcp_parity.py226 def _setup(c: Any) -> None:CODE
LOWtests/_baselines/registry.py316__all__ = [CODE
LOWtests/_baselines/storage_transaction_policy.py72__all__ = [CODE
LOWtests/_baselines/__init__.py20__all__ = ["BASELINES", "Baseline"]CODE
LOWtests/_baselines/module_size.py142__all__ = [CODE
LOWtests/_baselines/guardrail_literals.py79__all__ = [CODE
LOWtests/_guardrails/test_cookie_persistence_boundary.py568 def _set_local_client(self, name: str, value: bool) -> 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
LOWtests/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.py169 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.py331 async def set_mode(self, notebook_id: str, mode: Any) -> None:CODE
LOWtests/server/fakes.py760 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__.py22__all__ = [CODE
LOWscripts/_tracked_files.py29__all__ = ["tracked_files"]CODE
LOWscripts/_live_auth_scenarios/__init__.py48__all__ = [CODE
LOWsrc/notebooklm/_sharing.py9logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_sharing.py106__all__ = ["SharingAPI"]CODE
LOWsrc/notebooklm/_research.py14__all__ = [ # noqa: F822 - resolved lazily belowCODE
LOWsrc/notebooklm/auth.py107logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/auth.py191__all__ = [CODE
LOWsrc/notebooklm/_notes.py185__all__ = ["NotesAPI"]CODE
LOWsrc/notebooklm/_logging.py33__all__ = [CODE
LOWsrc/notebooklm/config.py17__all__ = [CODE
LOWsrc/notebooklm/_serving.py20__all__ = [CODE
LOWsrc/notebooklm/paths.py45logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/paths.py58__all__ = [CODE
LOWsrc/notebooklm/paths.py78def set_active_profile(profile: str | None) -> None:CODE
LOWsrc/notebooklm/research.py23logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/research.py148__all__ = [CODE
LOWsrc/notebooklm/log.py9__all__ = ["install_redaction"]CODE
LOWsrc/notebooklm/_transport_drain.py54logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_transport_drain.py324__all__ = ["TransportDrainTracker", "_TransportOperationToken"]CODE
LOWsrc/notebooklm/client.py80__all__ = ["NotebookLMClient"]CODE
LOWsrc/notebooklm/client.py82logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_idempotency.py32logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_idempotency.py252__all__ = ["idempotent_create", "mark_unconfirmed"]CODE
LOWsrc/notebooklm/io.py10__all__ = ["atomic_update_json", "atomic_write_json", "replace_file_atomically"]CODE
LOWsrc/notebooklm/_redact.py28__all__ = ["DEFAULT_MAX_MESSAGE", "redact"]CODE
LOWsrc/notebooklm/_loop_affinity.py62__all__ = ["assert_bound_loop"]CODE
LOWsrc/notebooklm/__init__.py215__all__ = [CODE
242 more matches not shown…
Deep Nesting257 hits · 224 pts
SeverityFileLineSnippetContext
LOWtests/cassette_patterns.py570CODE
LOWtests/vcr_config.py565CODE
LOWtests/vcr_config.py617CODE
LOWtests/unit/test_live_auth_matrix.py1043CODE
LOWtests/unit/test_streaming_chat_wire.py983CODE
LOWtests/unit/test_concurrency_refresh_race.py501CODE
LOWtests/unit/test_auth_cold_start_recovery.py438CODE
LOWtests/unit/test_auth_psidts_recovery.py434CODE
LOWtests/unit/test_app_master_token.py838CODE
LOWtests/unit/test_sources_row_adapter.py76CODE
LOWtests/unit/test_auth_mint_service.py141CODE
LOWtests/unit/test_init_order.py173CODE
LOWtests/unit/test_rpc_types.py34CODE
LOWtests/unit/test_rpc_overrides.py69CODE
LOWtests/unit/app/test_app_login_cookie.py371CODE
LOWtests/unit/cli/test_quiet_enforcement.py99CODE
LOWtests/_baselines/storage_transaction_policy.py17CODE
LOWtests/_baselines/module_size.py98CODE
LOWtests/_baselines/guardrail_literals.py54CODE
LOWtests/_guardrails/test_middleware_context_contract.py96CODE
LOWtests/_guardrails/test_auth_phase12c_boundaries.py253CODE
LOWtests/_guardrails/test_auth_storage_lock_boundary.py116CODE
LOWtests/_guardrails/test_auth_cookie_filter_boundary.py90CODE
LOWtests/_guardrails/test_auth_cookie_filter_boundary.py138CODE
LOWtests/_guardrails/test_no_session.py60CODE
LOWtests/_guardrails/test_auth_credential_io_boundary.py114CODE
LOWtests/_guardrails/test_cli_boundary.py271CODE
LOWtests/_guardrails/test_cli_boundary.py302CODE
LOWtests/_guardrails/test_cli_boundary.py335CODE
LOWtests/_guardrails/test_cli_boundary.py436CODE
LOWtests/_guardrails/test_cli_boundary.py561CODE
LOWtests/_guardrails/test_cli_boundary.py672CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py477CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py933CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py983CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py2265CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py293CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py1058CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py1409CODE
LOWtests/_guardrails/test_auth_profile_store_boundary.py1446CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py74CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py1251CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py1701CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py1965CODE
LOWtests/_guardrails/test_rotate_wire_contract.py121CODE
LOWtests/_guardrails/test_backend_boundaries.py231CODE
LOWtests/_guardrails/test_error_handler_allowlist.py104CODE
LOWtests/_guardrails/test_public_surface.py288CODE
LOWtests/_guardrails/test_no_session_compat_bridges.py165CODE
LOWtests/_guardrails/test_type_boundaries.py59CODE
LOWtests/_guardrails/test_type_boundaries.py133CODE
LOWtests/_guardrails/test_type_boundaries.py161CODE
LOWtests/_guardrails/test_type_boundaries.py184CODE
LOWtests/_guardrails/test_storage_writer_boundary.py103CODE
LOWtests/_guardrails/test_storage_writer_boundary.py185CODE
LOWtests/_guardrails/test_storage_writer_boundary.py650CODE
LOWtests/_guardrails/test_storage_writer_boundary.py777CODE
LOWtests/_guardrails/test_cli_rpc_envelope.py90CODE
LOWtests/_guardrails/test_cli_rpc_envelope.py127CODE
LOWtests/_guardrails/test_cli_rpc_envelope.py178CODE
197 more matches not shown…
Cross-File Repetition39 hits · 195 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/_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.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_idempotency_create.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_cancel_vcr.py0decode the form-encoded ``f.req`` body into its param list.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/_artifacts.py0revise an individual slide in a completed slide deck using a prompt.STRING
HIGHsrc/notebooklm/_web/artifacts.py0revise an individual slide in a completed slide deck using a prompt.STRING
HIGHsrc/notebooklm/_web/artifact/generation.py0revise an individual slide in a completed slide deck using a prompt.STRING
Excessive Try-Catch Wrapping147 hits · 147 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py399 except Exception:CODE
LOWtests/unit/test_windows_compatibility.py312 except Exception as e:CODE
LOWtests/unit/mcp/conftest.py92 except Exception as exc: # noqa: BLE001 - scripted per-item outcomeCODE
LOWtests/unit/cli/test_cli_mcp_parity.py172 except Exception as exc: # noqa: BLE001 - caller classifies (see _mcp_capture)CODE
LOWtests/unit/concurrency/test_close_cancellation_leak.py368 except Exception:CODE
LOWtests/_guardrails/test_storage_transaction_ratchet.py233 except Exception:STRING
LOWtests/integration/test_chat_delete_conversation_vcr.py139 except Exception as exc: # noqa: BLE001CODE
LOWtests/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
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.py154 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.py196 except Exception: # noqa: BLE001 - degrade to line-scan on any parse/read errorCODE
MEDIUMtests/e2e/conftest.py106def _ask_with_skip(*args, **kwargs):CODE
LOWtests/e2e/conftest.py748 except Exception as e:CODE
LOWtests/e2e/conftest.py809 except Exception:CODE
LOWtests/e2e/conftest.py924 except Exception:CODE
LOWtests/e2e/conftest.py933 except Exception:CODE
LOWtests/e2e/conftest.py1002 except Exception as e:CODE
LOWtests/e2e/conftest.py1028 except Exception:CODE
LOWtests/e2e/conftest.py1046 except Exception:CODE
LOWtests/e2e/conftest.py1198 except Exception as e:CODE
LOWtests/e2e/conftest.py889 except Exception:CODE
LOWtests/e2e/conftest.py891 except Exception:CODE
LOWtests/e2e/conftest.py902 except Exception:CODE
LOWtests/e2e/conftest.py904 except Exception:CODE
LOWtests/e2e/conftest.py1136 except Exception:CODE
LOWtests/e2e/conftest.py1138 except Exception:CODE
LOWtests/e2e/test_downloads.py133 except Exception:CODE
LOWdocs/rpc-reference.md210 except Exception:CODE
LOWdocs/python-api.md527except Exception as exc:CODE
LOWexamples/notes.py157 except Exception as e:CODE
LOWexamples/bulk-import.py64 except Exception as e:STRING
LOWexamples/bulk-import.py75 except Exception as e:STRING
LOWexamples/bulk-import.py86 except Exception as e:STRING
LOWexamples/chat.py102 except Exception as e:CODE
LOWscripts/diagnose_get_notebook.py140 except Exception as e:CODE
LOWscripts/capture_rpc_registry.py464 except Exception as exc:CODE
LOWscripts/mcp_live_smoke.py195 except Exception as exc: # noqa: BLE001 - top-level smoke wants one clean lineCODE
LOWscripts/audit_public_api_compat.py272 except Exception:CODE
LOWscripts/audit_public_api_compat.py351 except Exception: # pragma: no cover - defensive; repr should not raiseCODE
LOWscripts/audit_public_api_compat.py504 except Exception as exc:CODE
MEDIUMscripts/audit_public_api_compat.py280def signature_payload(obj):CODE
LOWscripts/_onetime_rescrub_cookies.py129 except Exception as exc: # noqa: BLE001CODE
LOWscripts/live_auth_matrix.py516 except Exception as exc: # noqa: BLE001 - report only the value-free exception typeCODE
MEDIUMscripts/live_auth_matrix.py280def run(self) -> int:CODE
LOWscripts/check_rpc_health.py1715 except Exception as e: # noqa: BLE001 - see "Never raises" aboveCODE
LOWscripts/check_rpc_health.py1988 except Exception as e:CODE
LOWscripts/check_rpc_health.py2004 except Exception as e:CODE
LOWscripts/check_rpc_health.py2020 except Exception as e:CODE
LOWscripts/check_rpc_health.py2029 except Exception as e:CODE
LOWsrc/notebooklm/client.py547 except Exception as close_exc:CODE
LOWsrc/notebooklm/_curl_cffi_transport.py164 except Exception: # noqa: BLE001 — cleanup must not mask the original errorCODE
LOWsrc/notebooklm/_notebooks.py157 except Exception as exc:CODE
LOWsrc/notebooklm/_notebooks.py220 except Exception as exc:CODE
LOWsrc/notebooklm/_client_metrics.py143 except Exception as exc: # noqa: BLE001 - observability must not alter behaviorCODE
LOWsrc/notebooklm/_atomic_io.py292 except Exception:CODE
LOWsrc/notebooklm/_atomic_io.py296 except Exception as cleanup_err:CODE
87 more matches not shown…
AI Slop Vocabulary27 hits · 86 pts
SeverityFileLineSnippetContext
MEDIUMtests/cassette_patterns.py209 # 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.py748 # or extra non-volatile dict keys — while staying robust against leafCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py449# so the mock-client harness can't drive them. The parametrized sweepCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py721 # the mock-client harness. `notebook_create` goes through the standardCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py746 # harness — they read NOTEBOOKLM_HOME directly. Stage a clean layoutCOMMENT
MEDIUMtests/unit/test_auth_cookie_save_race.py1762 # order) to stay robust across schedulers.COMMENT
MEDIUMtests/unit/test_row_adapters.py1367 # TZ-robust: compare the round-tripped epoch, not a wall-time string.COMMENT
MEDIUMtests/unit/test_json_error_exit.py728 # then invoke without the mock-client harness (these commands don'tCOMMENT
MEDIUMtests/unit/test_json_error_exit.py703# Filesystem-driven failure cases bypass the mock-client harness — theyCOMMENT
MEDIUMtests/unit/test_sources_upload_delegation.py53 # 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
MEDIUMtests/unit/test_vcr_body_matcher.py293# Volatile-key stripping — keep matching robust across recording timestampsCOMMENT
MEDIUMtests/unit/app/test_app_doctor.py590 # The ``browser`` extra is installed in CI; pin it so the test is robustCOMMENT
MEDIUMtests/unit/cli/test_login.py371 # 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/e2e/test_cli_live.py49 # or an enveloped object so the test is robust to the exact shape.COMMENT
MEDIUMtests/e2e/test_research_import_verification.py92 # makes this path robust for fast-mode imports too.COMMENT
MEDIUMscripts/capture_rpc_registry.py84# is robust to nested ``[...]`` in the options array (a single forward regexCOMMENT
MEDIUMsrc/notebooklm/_atomic_io.py413 # and re-introduce the divergent-lock race. ``casefold`` is the robustCOMMENT
LOWsrc/notebooklm/_web/sharing.py132 # Fetch current status and override view_level with what we just setCOMMENT
MEDIUMsrc/notebooklm/_app/doctor.py162 # Reuse the shared, name-robust extractor (drops non-dict rows andCOMMENT
Fake / Example Data74 hits · 75 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_storage_writer.py596 (storage_mod.AccountRecord(7, "user@example.com"), "set", 7, "user@example.com"),CODE
LOWtests/unit/test_auth_credential_io.py104 "email": "user@example.com",CODE
LOWtests/unit/test_auth_credential_io.py112 '{\n "version": 1,\n "email": "user@example.com",\n'CODE
LOWtests/unit/test_app_master_token.py72 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py121 plan = app.MasterTokenLoginPlan("user@example.com", storage, "android", False)CODE
LOWtests/unit/test_app_master_token.py137 assert calls[0][1] == {"email": "user@example.com", "storage_path": storage, "force": False}CODE
LOWtests/unit/test_app_master_token.py141 "email": "user@example.com",CODE
LOWtests/unit/test_app_master_token.py160 app.MasterTokenLoginPlan("user@example.com", storage, None, True),CODE
LOWtests/unit/test_app_master_token.py188 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py215 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py253 app.MasterTokenLoginPlan("user@example.com", storage, None, False),CODE
LOWtests/unit/test_app_master_token.py814 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
LOWtests/unit/test_cassette_sanitizer.py532 fake_key = "AIza" + "Z" * 35CODE
LOWtests/unit/test_cassette_sanitizer.py535 (examples / "leak.json").write_text(f'{{"JrWMbf":"{fake_key}"}}\n', encoding="utf-8")CODE
LOWtests/unit/test_chat_ask_invariants.py170 account_email="user@example.com",CODE
LOWtests/unit/test_chat_ask_invariants.py191 assert _extract_query_param(str(request.url), "authuser") == "user@example.com"CODE
LOWtests/unit/test_artifact_generation_prompt.py102 raw = _row_with_prompt(ArtifactTypeCode.AUDIO.value, 6, (1, 0), prompt="placeholder")CODE
LOWtests/unit/test_token_regex.py47 assert value == "user@example.com"CODE
LOWtests/unit/test_cassette_patterns.py258@pytest.mark.parametrize("placeholder", sorted(SCRUB_PLACEHOLDERS))CODE
LOWtests/unit/test_sharing_types.py276 data = ["user@example.com", 3, [], ["Test User", "https://avatar.url"]]CODE
LOWtests/unit/test_sharing_types.py279 assert user.email == "user@example.com"CODE
LOWtests/unit/test_sharing_types.py303 data = ["user@example.com", 2, []]CODE
LOWtests/unit/test_sharing_types.py306 assert user.email == "user@example.com"CODE
LOWtests/unit/test_sharing_types.py313 data = ["user@example.com", 99, []]CODE
LOWtests/unit/test_sharing_types.py320 data = ["user@example.com", {"permission": 3}, []]CODE
LOWtests/unit/test_sharing_types.py366 data = ["user@example.com", 3, [], ["Just Name"]]CODE
LOWtests/unit/test_sharing_types.py503 ["user@example.com", 3, [], ["Name", "https://avatar"]], # fullCODE
LOWtests/unit/test_sharing_types.py504 ["user@example.com", 2, []], # minimal (no user_info slot)CODE
LOWtests/unit/test_sharing_types.py505 ["user@example.com", 3, [], ["Just Name"]], # partial user_info (no avatar)CODE
LOWtests/unit/test_sharing_types.py506 ["user@example.com", 99, []], # unknown permissionCODE
LOWtests/unit/test_sharing_types.py507 ["user@example.com", {"k": 1}, []], # malformed (unhashable) permissionCODE
LOWtests/unit/app/test_app_sharing.py129 "user@example.com",CODE
LOWtests/unit/app/test_app_sharing.py139 "user@example.com",CODE
LOWtests/unit/app/test_app_sharing.py159 "user@example.com",CODE
LOWtests/unit/app/test_app_sharing.py166 "full_nb_part", "user@example.com", SharePermission.VIEWERCODE
LOWtests/unit/app/test_app_sharing.py181 await execute_share_remove_user(client, "nb_1", "user@example.com")CODE
LOWtests/unit/app/test_app_sharing.py183 client.sharing.remove_user.assert_awaited_once_with("nb_1", "user@example.com")CODE
LOWtests/unit/cli/test_share.py176 ["share", "add", "user@example.com", "-n", "nb_123"],CODE
LOWtests/unit/cli/test_share.py185 "user@example.com",CODE
LOWtests/unit/cli/test_share.py206 ["share", "add", "user@example.com", "-n", "nb_123", "-p", "editor"],CODE
LOWtests/unit/cli/test_share.py214 "user@example.com",CODE
LOWtests/unit/cli/test_share.py242 ["share", "remove", "user@example.com", "-n", "nb_123", "-y"],CODE
LOWtests/unit/cli/test_share.py248 mock_client.sharing.remove_user.assert_called_once_with("nb_123", "user@example.com")CODE
LOWtests/unit/cli/test_share.py289 ["share", "remove", "user@example.com", "-n", "nb_123", "--json"],CODE
LOWtests/unit/cli/test_share.py294 assert '"removed_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py314 ["share", "remove", "user@example.com", "-n", "nb_123", "--json"],CODE
LOWtests/unit/cli/test_share.py319 assert '"removed_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py321 mock_client.sharing.remove_user.assert_called_once_with("nb_123", "user@example.com")CODE
LOWtests/unit/cli/test_share.py487 assert '"updated_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py663 ["share", "add", "user@example.com", "-n", "nb_123", "--json"],CODE
LOWtests/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
LOWtests/unit/cli/test_session_characterization.py200 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
LOWtests/integration/test_sharing_integration.py358 ["user@example.com", 2, [], ["User", "https://avatar"]], # Now editorCODE
LOWtests/integration/test_sharing_integration.py369 "user@example.com",CODE
14 more matches not shown…
Structural Annotation Overuse36 hits · 66 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_cookie_domain_split.py614 # Step 2: storage_state → DomainCookieMap (used by AuthTokens).COMMENT
LOWtests/unit/test_cookie_domain_split.py620 # Step 3: storage_state → httpx jar (used by downloads + refresh).COMMENT
LOWtests/unit/test_cookie_domain_split.py628 # Step 4: the runtime gate itself accepts every YouTube variant.COMMENT
LOWtests/unit/test_cookie_domain_split.py603 # Step 1: rookiepy → storage_state conversion must keep the YouTubeCOMMENT
LOWtests/integration/test_sources_integration.py831 # Step 0: register_file_source captures a baseline GET_NOTEBOOKCOMMENT
LOWtests/integration/test_sources_integration.py834 # Step 1: Mock RPC registration response (o4cbdc)COMMENT
LOWtests/integration/test_sources_integration.py844 # Step 2: Mock upload session start responseCOMMENT
LOWtests/integration/test_sources_integration.py854 # Step 3: Mock upload finalize responseCOMMENT
LOWtests/integration/test_sources_integration.py1048 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py1050 # Step 1: Mock RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py1060 # Step 2: Mock upload session startCOMMENT
LOWtests/integration/test_sources_integration.py1070 # Step 3: Mock upload finalizeCOMMENT
LOWtests/integration/test_sources_integration.py2844 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py2846 # Step 1: Successful RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py2856 # Step 2: Upload session response WITHOUT the required upload URL headerCOMMENT
LOWtests/e2e/test_research_import_verification.py42 # Step 1: Start fast web researchCOMMENT
LOWtests/e2e/test_research_import_verification.py56 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research_import_verification.py74 # Step 3: Get sources to importCOMMENT
LOWtests/e2e/test_research_import_verification.py88 # Step 4: Import sources. Use the verification-aware variant so anCOMMENT
LOWtests/e2e/test_research_import_verification.py99 # Step 5: Poll for imported sources to appearCOMMENT
LOWtests/e2e/test_research_import_verification.py111 # Step 6: Verify source countCOMMENT
LOWtests/e2e/test_research.py196 # Step 1: Start researchCOMMENT
LOWtests/e2e/test_research.py207 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research.py229 # Step 3: Import sources (if any found)COMMENT
LOWdocs/troubleshooting.md544# Step 1: Install bird (macOS/Linux)COMMENT
LOWdocs/troubleshooting.md547# Step 2: Fetch X.com content as markdownCOMMENT
LOWdocs/troubleshooting.md550# Step 3: Add the local markdown file to NotebookLMCOMMENT
LOWdocs/rpc-development.md253### Step 1: CaptureCOMMENT
LOWdocs/rpc-development.md262### Step 2: DecodeCOMMENT
LOWdocs/rpc-development.md280### Step 3: ImplementCOMMENT
LOWdocs/rpc-development.md329### Step 4: TestCOMMENT
LOWdocs/rpc-development.md363### Step 5: DocumentCOMMENT
LOWexamples/video.py26 # Step 1: Create a notebook with contentCOMMENT
LOWexamples/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
Modern AI Meta-Vocabulary24 hits · 66 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
MEDIUMtests/unit/test_check_rpc_health.py587# The streamed-chat orchestration RPC has no obfuscated method ID to echo backCOMMENT
MEDIUMtests/unit/test_drive_import.py442# DriveImportService — orchestration, cleanup, second defenseCOMMENT
MEDIUMtests/unit/test_audit_auth_patch_sites.py60# string-target patch — and it correctly trips both ADR-0007 guardrailsCOMMENT
MEDIUMtests/unit/test_rpc_health_coverage.py118# without re-introducing the whole skip-list scaffolding.COMMENT
MEDIUMtests/unit/test_chat_transport.py50# Test scaffoldingCOMMENT
MEDIUMtests/unit/app/test_app_source_clean.py236# run_source_clean — orchestrationCOMMENT
MEDIUMtests/_guardrails/_wire_contract.py52#: which lives in its own package rather than the ``orchestration.v1`` wire section.COMMENT
MEDIUMtests/cassettes/cli_notebook_create.yaml2158 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505574,851569000],[\\\"0fCODE
MEDIUMtests/cassettes/cli_notebook_create.yaml2159 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505614,213638000],[\\\"10CODE
MEDIUMtests/cassettes/workflow_tracer_bullet.yaml2086 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505574,851569000],[\\\"0fCODE
MEDIUMtests/cassettes/workflow_tracer_bullet.yaml2087 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505614,213638000],[\\\"10CODE
MEDIUMtests/cassettes/cli_notebook_list.yaml2158 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505574,851569000],[\\\"0fCODE
MEDIUMtests/cassettes/cli_notebook_list.yaml2159 SEO 2026:The Ultimate Roadmap to AI Agent Visibility - Karan Powar\\\",[null,3905,[1773505614,213638000],[\\\"10CODE
MEDIUMdocs/architecture.md1179│ ├── login_cookie.py # Click-free login/cookie-import operations: request validation, browser-jar probing, aCODE
MEDIUMdocs/architecture.md1194│ ├── source_clean.py # Click-free `source clean` core: junk-source classification + batched-deletion orchestCODE
MEDIUMdocs/architecture.md1277├── _chat.py # Abstract ChatAPI + shared locks/cache/ask/delete/save-note orchestration and lazy priCODE
MEDIUMdocs/development.md47├── _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.md219### Rule 4 — `Session` retains only orchestration plus the documented middleware-chain seamsCOMMENT
MEDIUMscripts/check_rpc_health.py2126 # Probe the streamed-chat orchestration RPC. It is not anCOMMENT
MEDIUMsrc/notebooklm/_web/params/notebooks.py74# what the backend RETURNS for each mode. ``5`` critique / ``6`` debate scaffolding /COMMENT
Verbosity Indicators28 hits · 52 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_cookie_domain_split.py614 # Step 2: storage_state → DomainCookieMap (used by AuthTokens).COMMENT
LOWtests/unit/test_cookie_domain_split.py620 # Step 3: storage_state → httpx jar (used by downloads + refresh).COMMENT
LOWtests/unit/test_cookie_domain_split.py628 # Step 4: the runtime gate itself accepts every YouTube variant.COMMENT
LOWtests/unit/test_cookie_domain_split.py603 # Step 1: rookiepy → storage_state conversion must keep the YouTubeCOMMENT
LOWtests/integration/test_sources_integration.py831 # Step 0: register_file_source captures a baseline GET_NOTEBOOKCOMMENT
LOWtests/integration/test_sources_integration.py834 # Step 1: Mock RPC registration response (o4cbdc)COMMENT
LOWtests/integration/test_sources_integration.py844 # Step 2: Mock upload session start responseCOMMENT
LOWtests/integration/test_sources_integration.py854 # Step 3: Mock upload finalize responseCOMMENT
LOWtests/integration/test_sources_integration.py1048 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py1050 # Step 1: Mock RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py1060 # Step 2: Mock upload session startCOMMENT
LOWtests/integration/test_sources_integration.py1070 # Step 3: Mock upload finalizeCOMMENT
LOWtests/integration/test_sources_integration.py2844 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py2846 # Step 1: Successful RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py2856 # Step 2: Upload session response WITHOUT the required upload URL headerCOMMENT
LOWtests/e2e/test_research_import_verification.py42 # Step 1: Start fast web researchCOMMENT
LOWtests/e2e/test_research_import_verification.py56 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research_import_verification.py74 # Step 3: Get sources to importCOMMENT
LOWtests/e2e/test_research_import_verification.py88 # Step 4: Import sources. Use the verification-aware variant so anCOMMENT
LOWtests/e2e/test_research_import_verification.py99 # Step 5: Poll for imported sources to appearCOMMENT
LOWtests/e2e/test_research_import_verification.py111 # Step 6: Verify source countCOMMENT
LOWtests/e2e/test_research.py196 # Step 1: Start researchCOMMENT
LOWtests/e2e/test_research.py207 # Step 2: Poll until completeCOMMENT
LOWtests/e2e/test_research.py229 # Step 3: Import sources (if any found)COMMENT
LOWexamples/video.py26 # Step 1: Create a notebook with contentCOMMENT
LOWexamples/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
Hallucination Indicators4 hits · 50 pts
SeverityFileLineSnippetContext
CRITICALtests/unit/mcp/test_studio.py1363 assert mock_client.artifacts.download_quiz.await_args.kwargs.get("output_format") == "markdown"CODE
CRITICALtests/unit/cli/test_generate.py820 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
CRITICALtests/integration/test_vcr_example.py82 # Simulate the request format from notebooklm._web.transport.executor.RpcExecutor.rpc_call()COMMENT
Self-Referential Comments15 hits · 40 pts
SeverityFileLineSnippetContext
MEDIUMtests/unit/test_artifact_downloads.py759 # Create the complex nested structure for data table.COMMENT
MEDIUMtests/unit/test_sources_upload.py971 # Create a temp fileCOMMENT
MEDIUMtests/unit/cli/test_resolve.py333 # Create a notebook with a short ID that we'll match exactlyCOMMENT
MEDIUMtests/unit/cli/test_source.py680 # Create a temp fileCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py810 # Create a test fileCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py900 # Create a source to deleteCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py938 # Create a notebook to deleteCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py970 # Create a note to deleteCOMMENT
MEDIUMtests/e2e/test_artifacts.py246 # Create a quiz artifact for deletion (different type than flashcards)COMMENT
MEDIUMtests/e2e/test_sources.py121 # Create a source to deleteCOMMENT
MEDIUMexamples/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.py171 notebooklm create "My Notes" # Create a notebookSTRING
MEDIUMsrc/notebooklm/_auth/browser_capture.py1305 # Create a TEMPORARY page we own for the navigation, and close ONLYCOMMENT
Synthetic Comment Markers3 hits · 26 pts
SeverityFileLineSnippetContext
HIGHdocs/python-api.md1212# Get AI-generated description (parsed with suggested topics)COMMENT
HIGHdocs/python-api.md1321# Get AI-generated summary and keywords (returns a typed SourceGuide)COMMENT
HIGHexamples/video.py51 # - CINEMATIC: AI-generated documentary footage (Veo 3)COMMENT
Dead Code7 hits · 14 pts
SeverityFileLineSnippetContext
MEDIUMtests/server/conftest.py67CODE
MEDIUMtests/server/test_app_lifecycle.py165CODE
MEDIUMtests/server/test_app_lifecycle.py217CODE
MEDIUMtests/server/test_app_lifecycle.py244CODE
MEDIUMtests/server/test_app_lifecycle.py269CODE
MEDIUMtests/server/test_sources.py90CODE
MEDIUMtests/server/test_meta.py205CODE
AI Structural Patterns17 hits · 14 pts
SeverityFileLineSnippetContext
LOWtests/_helpers/client_factory.py29CODE
LOWtests/unit/test_auth_profile_store_minted.py37CODE
LOWtests/unit/test_rpc_executor.py860CODE
LOWtests/unit/test_rpc_golden_payloads.py1579CODE
LOWtests/unit/app/test_app_research.py38CODE
LOWtests/unit/cli/test_playwright_login_render_contract.py166CODE
LOWtests/_guardrails/test_auth_storage_compatibility.py1812CODE
LOWsrc/notebooklm/_client_assembly.py93CODE
LOWsrc/notebooklm/client.py151CODE
LOWsrc/notebooklm/client.py626CODE
LOWsrc/notebooklm/exceptions.py413CODE
LOWsrc/notebooklm/_auth/refresh.py711CODE
LOWsrc/notebooklm/mcp/tools/studio.py313CODE
LOWsrc/notebooklm/mcp/tools/sources.py504CODE
LOWsrc/notebooklm/cli/resolve.py192CODE
LOWsrc/notebooklm/_web/transport/executor.py122CODE
LOWsrc/notebooklm/_runtime/init.py494CODE
Redundant / Tautological Comments8 hits · 13 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/e2e/test_chat.py68 # Check if any references have cited_textCOMMENT
LOWscripts/check_rpc_health.py859 # Check if error response still contains our expected IDCOMMENT
LOWscripts/check_rpc_health.py876 # Check if expected ID is in responseCOMMENT
LOW.github/workflows/nightly.yml56 # Check if it's main or a release branchCOMMENT
LOWsrc/notebooklm/_auth/cookie_policy.py890 # Check if it's a valid canonical Google domain (base or regional).COMMENT
LOWsrc/notebooklm/_app/chat.py121 # Check if the user switched notebooks via the --notebook flag. Only readCOMMENT