Repository Analysis

teng-lin/notebooklm-py

Unofficial Python API and agentic skill for Google NotebookLM. 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.

35.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 17,744 GitHub stars. SynthScan v2.0 examined 574,232 lines of code across 1156 source files, recording 13845 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 35.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).

35.6
Adjusted Score
35.6
Raw Score
100%
Time Factor
2026-07-14
Last Push
17.7K
Stars
Python
Language
574.2K
Lines of Code
1.2K
Files
13.8K
Pattern Hits
2026-07-14
Scan Date
0.16
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 3HIGH 187MEDIUM 2475LOW 11180

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 13845 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.

Decorative Section Separators2404 hits · 9162 pts
SeverityFileLineSnippetContext
MEDIUMtests/cassette_patterns.py715# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py717# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py724 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py726 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py751 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py753 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py760 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py762 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py770 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py772 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py779 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py781 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py856 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py858 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py868 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py870 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py888 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py890 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py895 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py897 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py1193# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1195# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1198# ---------------------------------------------------------------------------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.py405# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py407# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py512# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py514# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py795 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py797 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py822 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py824 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py837 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py839 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py910 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py912 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py934 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py936 # -------------------------------------------------------------------------COMMENT
MEDIUMtests/cassette_patterns.py949# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py951# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1499# =============================================================================COMMENT
MEDIUMtests/cassette_patterns.py1501# =============================================================================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
2344 more matches not shown…
Hyper-Verbose Identifiers8590 hits · 7753 pts
SeverityFileLineSnippetContext
LOWtests/conftest.py285def pytest_collection_modifyitems(config, items):CODE
LOWtests/conftest.py342def mock_list_notebooks_response():STRING
LOWtests/cassette_patterns.py1532def synthetic_error_cassette_name(mode: str, slug: str) -> str:CODE
LOWtests/cassette_patterns.py1549def 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.py1140def test_matched_partial_id_goes_to_stderr_in_json_mode(runner: CliRunner, mock_auth_env) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py215 async def wait_for_research_completion(CODE
LOWtests/unit/test_json_stdout_purity.py302def _customize_suggest_prompts(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py315def _customize_share_view_level(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py319def _customize_source_fulltext(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py341def _customize_source_add_research(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py368def _customize_research_cancel(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py374def _customize_notebook_create(client: MagicMock) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py645def test_json_mode_stdout_is_parseable(CODE
LOWtests/unit/test_json_stdout_purity.py1040def test_all_json_commands_have_sweep_entry() -> None:CODE
LOWtests/unit/test_json_stdout_purity.py1159def 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.py374 def test_explicit_storage_path_normalizes_onto_auth_without_mutating_caller(self, tmp_path):CODE
LOWtests/unit/test_client_keepalive.py406 async def test_close_persists_to_explicit_storage_path(self, tmp_path, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py442 async def test_persists_rotated_cookies_without_aexit(self, tmp_path, httpx_mock: HTTPXMock):CODE
LOWtests/unit/test_client_keepalive.py485 async def test_save_cookies_takes_in_process_lock_before_writing(self, tmp_path):CODE
LOWtests/unit/test_client_keepalive.py536 async def test_refresh_auth_routes_save_through_save_cookies(CODE
LOWtests/unit/test_client_keepalive.py620 def test_save_cookies_to_storage_acquires_file_lock(self, tmp_path, monkeypatch):CODE
LOWtests/unit/test_client_keepalive.py662 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.py1626 def test_parse_single_citation_returns_none_when_not_list(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1632 def test_parse_single_citation_returns_none_when_too_short(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1638 def test_parse_single_citation_returns_none_when_cite_inner_not_list(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1644 def test_parse_single_citation_returns_none_when_no_source_id(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1732 def test_non_list_input_returns_immediately(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1739 def test_non_list_input_none_returns_immediately(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1746 def test_nested_group_not_list_is_skipped(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1754 def test_text_val_is_list_extracts_strings(self, auth_tokens):CODE
LOWtests/unit/test_chat_characterization.py1764 def test_text_val_list_skips_non_strings(self, auth_tokens):CODE
8530 more matches not shown…
Unused Imports1553 hits · 1259 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.py11CODE
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_vcr_scrubbing.py30CODE
LOWtests/unit/test_auth_instance_invariant.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_serving.py9CODE
LOWtests/unit/test_streaming_chat_wire.py3CODE
LOWtests/unit/test_streaming_chat_wire.py797CODE
LOWtests/unit/test_get_or_none.py15CODE
LOWtests/unit/test_browser_capture_cdp_arm.py25CODE
LOWtests/unit/test_concurrency_refresh_race.py58CODE
LOWtests/unit/test_middleware_chain_host.py28CODE
LOWtests/unit/test_capture_rpc_registry.py8CODE
LOWtests/unit/test_generation_state.py15CODE
LOWtests/unit/test_research_row_adapter.py15CODE
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.py19CODE
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_logging_correlation.py3CODE
LOWtests/unit/test_download_result.py3CODE
LOWtests/unit/test_chat_passage_resolver.py15CODE
LOWtests/unit/test_auth_session_headless_reauth.py19CODE
LOWtests/unit/test_chat_helpers.py11CODE
LOWtests/unit/test_auth_psidts_recovery.py12CODE
LOWtests/unit/test_mind_maps_api.py3CODE
LOWtests/unit/test_error_injection_middleware.py41CODE
LOWtests/unit/test_drive_import.py15CODE
LOWtests/unit/test_chain_wiring.py27CODE
LOWtests/unit/test_interactive_mind_map.py11CODE
LOWtests/unit/test_playwright_marker_hook.py22CODE
LOWtests/unit/test_e2e_conftest_options.py11CODE
LOWtests/unit/test_auth_account_coverage.py13CODE
LOWtests/unit/test_runtime_auth.py35CODE
LOWtests/unit/test_cookie_domain_split.py21CODE
LOWtests/unit/test_notebook_metadata.py3CODE
LOWtests/unit/test_download_url.py11CODE
LOWtests/unit/test_label_model.py3CODE
LOWtests/unit/test_tier_13_all_exports.py15CODE
LOWtests/unit/test_profile_atomic_write.py38CODE
LOWtests/unit/test_sources_row_adapter.py22CODE
LOWtests/unit/test_atomic_io.py14CODE
1493 more matches not shown…
Cross-Language Confusion79 hits · 456 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.py798 body = ')]}\'\n\n[["wrb.fr","sqTeoe","null",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_check_rpc_health.py812 body = ')]}\'\n\n[["wrb.fr","sqTeoe","[[1,2,3]]",null,null,null,"generic"]]'CODE
HIGHtests/unit/test_decoder.py866 """[5, null, 'x'] is not the bare form — no enrichment."""STRING
HIGHtests/unit/test_chat_ask_invariants.py377 '63\n[["wrb.fr","hPTbtc","[[[\\"real-conv-id-from-hptbtc\\"]]]",null,null]]'CODE
HIGHtests/unit/test_api_coverage.py149 # Real API returns 3 levels of nesting: [[[null, [summary], [[keywords]], []]]]COMMENT
HIGHtests/unit/test_api_coverage.py186 # Response format: [[[title, description, null, null, prompt, audience_level], ...]]COMMENT
HIGHtests/unit/test_api_coverage.py301 # Verify reference payload: [null, ["source_id"], [2]]COMMENT
HIGHtests/unit/test_api_coverage.py317 # 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.py276 ever emits ``[null, ...]`` at index 15 the sort must coerce thatSTRING
HIGHtests/unit/test_auth_cookie_save_race.py1017 f"None-valued cookie must never be persisted as value:null, got: {stored}"CODE
HIGHtests/unit/test_save_chat_as_note_encoder.py106 # passage[3] = [[null, start, end]]; passage[5] = [[[passage_id], source_id]];COMMENT
HIGHtests/unit/test_save_chat_as_note_encoder.py202 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.py173 '{"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.py332 # ``[None]`` (leading slot present but null) yields ``None`` — theCOMMENT
HIGHtests/unit/test_source_selection.py1061 # Response format: [[[title, description, null, null, prompt, audience_level], ...]]COMMENT
HIGHtests/unit/mcp/test_sources.py233 # ``status: Literal[...] | None`` serializes as an ``anyOf`` of {enum} + {null}.COMMENT
HIGHtests/unit/mcp/test_sources.py1541 {"source": null} as success — it projects NOT_FOUND."""STRING
HIGHtests/unit/cli/test_note.py578 CLI emitted ``{"id": null, "created": false, "error": "Creation maySTRING
HIGHtests/unit/cli/test_playwright_login_render_contract.py709 " 2. Or run: notebooklm auth logout && notebooklm login\n"CODE
HIGHtests/unit/cli/test_playwright_login_render_contract.py766 " 2. Or run: notebooklm auth logout && notebooklm login\n"CODE
HIGHtests/unit/cli/test_playwright_login_render_contract.py840 " 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/test_golden_decode_coverage.py220 # ([] for web, [[null, true, [id]]] for drive) are pinned to ``is True``COMMENT
HIGHtests/integration/test_vcr_comprehensive.py803 # Drive sources return [[null, true, [source_id]]] when freshCOMMENT
HIGHtests/integration/test_artifacts_integration.py2544 """An empty (non-null) CREATE_ARTIFACT result drifts and raises.STRING
HIGHtests/integration/test_chat_delete_conversation_vcr.py189 assert params[2] is None, f"slot 2 must be null, got {params[2]!r}"CODE
HIGHtests/integration/test_vcr_example.py84 'f.req=[[["methodId",null,null,[[["notebook_id","data"]]]]]]&at=fake_csrf_token'CODE
HIGHtests/integration/test_notebooks_integration.py301 # First response for rename (returns null)COMMENT
HIGHtests/integration/test_notebooks_integration.py334 # Rename response (returns null)COMMENT
HIGHtests/integration/test_notebooks_integration.py588 # summary-less payloads. ``[[None]]`` (summary slot explicitly null) isCOMMENT
HIGHtests/integration/test_notebooks_suggest_prompts_vcr.py121 assert params[4] is None, f"slot 4 must be null, got {params[4]!r}"CODE
HIGHtests/integration/test_chat_oversized_rejection_vcr.py8 [["wrb.fr", null, null, null, null, [3]]] # 3 == INVALID_ARGUMENTSTRING
HIGHtests/integration/test_chat_oversized_rejection_vcr.py10 [["e", 4, null, null, 132]] # stream bookkeeping, NOT the errorSTRING
HIGHtests/integration/test_sources_integration.py775 # UPDATE_SOURCE echoes null, then the hydrate fetch blows up.COMMENT
HIGHtests/integration/test_sources_integration.py608 assert is_fresh is True, "Nested [null, true, ...] should mean source is fresh"CODE
HIGHtests/integration/test_sources_integration.py634 # Real API returns 3 levels of nesting: [[[null, [summary], [[keywords]], []]]]COMMENT
HIGHtests/integration/test_sources_integration.py598 Drive sources return [[null, true, [source_id]]] when fresh,STRING
HIGHtests/integration/test_research_cancel_vcr.py191 assert params[0] is None, f"slot 0 must be null, got {params[0]!r}"CODE
HIGHtests/integration/test_research_cancel_vcr.py192 assert params[1] is None, f"slot 1 must be null, got {params[1]!r}"CODE
HIGHtests/integration/cli_vcr/conftest.py340 """When ``item[field]`` is present and non-null, it must be in ``allowed``."""STRING
HIGHtests/integration/concurrency/test_chat_history_race.py80 ``[null, "<params-json>"]``; the inner params list matches the orderSTRING
HIGHtests/integration/concurrency/test_chat_history_race.py650 # Null chat POST: params[4] is null; the answer's stream id is discardedCOMMENT
HIGHtests/integration/mcp_vcr/test_sources.py331 issued is ``UPDATE_SOURCE`` (``b7Wfje``). The recorded echo is non-null, soSTRING
19 more matches not shown…
Docstring Block Structure74 hits · 370 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.py1552Return a ``(status_code, body, headers)`` triple for a synthetic error. The shape is intentionally minimal; the cliSTRING
HIGHsrc/notebooklm/_sharing.py148Share notebook with a user. Args: notebook_id: The notebook ID. email: User's email addSTRING
HIGHsrc/notebooklm/_research.py317Start a research session. Args: notebook_id: The notebook ID. query: The research querySTRING
HIGHsrc/notebooklm/_research.py496Poll until research reaches a terminal state or times out. When the first poll returns a concrete ``task_id``, STRING
HIGHsrc/notebooklm/_reqid_counter.py124Atomically increment the counter and return the new value. Args: step: Increment applied to the couSTRING
HIGHsrc/notebooklm/_notes.py93Get a specific note by ID. Args: notebook_id: The notebook ID. note_id: The note ID. STRING
HIGHsrc/notebooklm/paths.py219Get directory for a specific profile. Args: profile: Profile name. If None, resolves via resolve_profile().STRING
HIGHsrc/notebooklm/client.py714Refresh authentication tokens by fetching the NotebookLM homepage. This helps prevent 'Session Expired' errors STRING
HIGHsrc/notebooklm/_idempotency.py84Probe-then-retry wrapper for mutating create RPCs. Args: create: Coroutine factory that issues the create RSTRING
HIGHsrc/notebooklm/_sources.py151Get details of a specific source. Args: notebook_id: The notebook ID. source_id: The soSTRING
HIGHsrc/notebooklm/_sources.py207Wait for a source to become ready. Polls until READY, terminal ERROR, or timeout. Configured transient STRING
HIGHsrc/notebooklm/_sources.py295Wait for a source to be registered server-side (status >= PROCESSING). Polls until the source is visible in theSTRING
HIGHsrc/notebooklm/_sources.py345Wait for multiple sources to become ready in parallel. Args: notebook_id: The notebook ID. STRING
HIGHsrc/notebooklm/_sources.py429Add a text source (copied text) to a notebook. Args: notebook_id: The notebook ID. titlSTRING
HIGHsrc/notebooklm/_sources.py483Add a file source to a notebook using Google's resumable upload. Registers the source, opens an upload session,STRING
HIGHsrc/notebooklm/_sources.py659Rename a source. Args: notebook_id: The notebook ID. source_id: The source ID to renameSTRING
HIGHsrc/notebooklm/_sources.py731Check if a source needs to be refreshed. Args: notebook_id: The notebook ID. source_id:STRING
HIGHsrc/notebooklm/_sources.py780Get the full content of a source. Args: notebook_id: The notebook ID. source_id: The soSTRING
HIGHsrc/notebooklm/_notebooks.py374Get AI-suggested prompts for a notebook. Backed by ``GeneratePromptSuggestions`` (``otmP3b``): a *general* STRING
HIGHsrc/notebooklm/_notebooks.py674Get notebook details. Args: notebook_id: The notebook ID. Returns: Notebook obSTRING
HIGHsrc/notebooklm/utils.py37Return 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.py414Rename a mind map (dispatches by kind: ``UPDATE_NOTE`` / ``RENAME_ARTIFACT``). Omitting ``kind`` triggers an exSTRING
HIGHsrc/notebooklm/_chat/notes.py189Build CREATE_NOTE params for the saved-from-chat variant. Produces the 7-element params array used by the web UI's STRING
HIGHsrc/notebooklm/_chat/notes.py291Save a chat answer as a citation-rich note via the saved-from-chat CREATE_NOTE variant (issue #660). Unlike theSTRING
HIGHsrc/notebooklm/_chat/api.py268Ask the notebook a question. Args: notebook_id: The notebook ID. question: The questionSTRING
HIGHsrc/notebooklm/_chat/api.py817Read the notebook's current chat configuration. Decodes the chat-settings block from ``GET_NOTEBOOK`` so a *parSTRING
HIGHsrc/notebooklm/_chat/api.py875Save a chat answer as a citation-rich note (issue #660). Unlike :meth:`NotesAPI.create`, this preserves the ``[STRING
HIGHsrc/notebooklm/_auth/cookies.py164Extract Google cookies from Playwright storage state for NotebookLM auth. Filters through the canonical auth-domainSTRING
HIGHsrc/notebooklm/_auth/cookies.py263Load Playwright storage state from file or environment variable. This is a shared helper used by load_auth_from_stoSTRING
HIGHsrc/notebooklm/_auth/cookies.py324Load cookies as an httpx.Cookies object for authenticated downloads. Unlike load_auth_from_storage() which returns STRING
HIGHsrc/notebooklm/_auth/cookies.py368Extract Google cookies from storage state preserving original identity. Returns a path-aware ``(name, domain, path)STRING
HIGHsrc/notebooklm/_auth/cookies.py404Build an httpx.Cookies jar with original domains preserved. This function loads cookies from storage and creates a STRING
HIGHsrc/notebooklm/_auth/tokens.py131Create AuthTokens from Playwright storage state file. This is the recommended way to create AuthTokens for progSTRING
HIGHsrc/notebooklm/_auth/tokens.py248Load Google cookies from storage as a flat name→value dict. Loads authentication cookies with the following precedeSTRING
HIGHsrc/notebooklm/_auth/browser_capture.py752Capture NotebookLM storage state by attaching to a running Chrome over CDP. An **alternative credential source** foSTRING
HIGHsrc/notebooklm/_auth/extraction.py69Extract a ``WIZ_global_data[key]`` value from a NotebookLM HTML response. NotebookLM (and other Google products) emSTRING
HIGHsrc/notebooklm/_auth/extraction.py207 Extract CSRF token (SNlM0e) from NotebookLM page HTML. The CSRF token is embedded in the page's WIZ_global_datSTRING
HIGHsrc/notebooklm/_auth/extraction.py253 Extract session ID (FdrFJe) from NotebookLM page HTML. The session ID is embedded in the page's WIZ_global_datSTRING
HIGHsrc/notebooklm/_auth/refresh.py694Internal: fetch CSRF and session tokens using a pre-built cookie jar. This is the single implementation for all tokSTRING
HIGHsrc/notebooklm/_auth/refresh.py776Fetch tokens from a cookie mapping. For backward compatibility. Prefer AuthTokens.from_storage() which preserves coSTRING
HIGHsrc/notebooklm/_auth/refresh.py825Fetch tokens with domain-preserving cookies from storage. Used by CLI helpers. Loads storage, builds jar, fetches tSTRING
HIGHsrc/notebooklm/_auth/refresh.py879Validate the auth cookies on disk without any side effects. Performs the same token-fetch round-trip (a homepage GESTRING
HIGHsrc/notebooklm/_auth/account.py144Enumerate Google accounts visible to the given cookie jar. Probes ``https://notebooklm.google.com/?authuser=N`` forSTRING
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.py228Resolve a ``--browser-cookies 'firefox::<spec>'`` to a selector. Args: profile_path: Firefox profile directSTRING
HIGHsrc/notebooklm/cli/_firefox_containers.py409Read ``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 ``rookiepy.any_browser(db_path, domains=…)`STRING
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.py78Get auth components from context. Args: ctx: Click context with optional storage_path in obj Returns: STRING
14 more matches not shown…
Over-Commented Block361 hits · 314 pts
SeverityFileLineSnippetContext
LOWpyproject.toml41COMMENT
LOWpyproject.toml181[tool.coverage.run]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 # Run as YOUR uid:gid so the mounted profile's files (owned by you on theCOMMENT
LOWdeploy/docker-compose.yml41 # tunnel egress), i.e. one global bucket. Tailscale Funnel does not set this header.COMMENT
LOWdeploy/docker-compose.yml61 cloudflared:COMMENT
LOWdeploy/docker-compose.yml81 condition: service_healthyCOMMENT
LOWtests/cassette_patterns.py341 # URL-encoded form for ``?authuser=`` query params. The provider-COMMENT
LOWtests/cassette_patterns.py361COMMENT
LOWtests/cassette_patterns.py401 }COMMENT
LOWtests/cassette_patterns.py421# legitimate non-secret occurrence in a cassette, so collapsing to the canonicalCOMMENT
LOWtests/cassette_patterns.py441# scrubber would proceed to clobber the longer name.COMMENT
LOWtests/cassette_patterns.py461# token by construction and is never legitimate fixture content, so weCOMMENT
LOWtests/cassette_patterns.py481# The ``JrWMbf`` leak (the NotebookLM web API key round-tripping into theCOMMENT
LOWtests/cassette_patterns.py521# but they ARE real per-user values, so the bar is: NO cookie value anywhere inCOMMENT
LOWtests/cassette_patterns.py701# (storage_state name-first / value-first / bare-key forms). Derived fromCOMMENT
LOWtests/cassette_patterns.py721# scrubbers use context-aware (callable) replacements where exact-matchCOMMENT
LOWtests/cassette_patterns.py741 # ``ya29.`` carry floors to avoid incidental short-literal matches).COMMENT
LOWtests/cassette_patterns.py761 # 2. CSRF and session tokens in WIZ_global_data (HTML / JSON responses)COMMENT
LOWtests/cassette_patterns.py801 # ``authuser=<email>`` query-param form. The client appends this toCOMMENT
LOWtests/cassette_patterns.py821 (_EMAIL_PATTERN_BASE, "SCRUBBED_EMAIL@example.com"),COMMENT
LOWtests/cassette_patterns.py861 # ``scrub_string`` (the validator would flag it but the sanitizer couldCOMMENT
LOWtests/cassette_patterns.py881 (COMMENT
LOWtests/cassette_patterns.py901 # IDs, conversation IDs, and other internal NotebookLM identifiers.COMMENT
LOWtests/cassette_patterns.py921 # allowlist a broad ``\\"[A-Z][a-z]+(?: [A-Z][a-z]+)+\\"`` regex wouldCOMMENT
LOWtests/cassette_patterns.py981)COMMENT
LOWtests/cassette_patterns.py1101# both raw tokens AND their canonical placeholder form so that an already-COMMENT
LOWtests/cassette_patterns.py1121# Full upload URL is rewritten to a trusted-host placeholder with a scrubbedCOMMENT
LOWtests/cassette_patterns.py1141# leak (the placeholder string doesn't itself contain ``lh3.``).COMMENT
LOWtests/cassette_patterns.py1161# Double-encoded ``authuser%3D<email>`` shape detector (issue #1368). Unlike theCOMMENT
LOWtests/cassette_patterns.py1181# Note Title"`` or ``alice@gmail.com`` — these shapes never match legitimateCOMMENT
LOWtests/cassette_patterns.py1201# That makes the guard NECESSARY-but-not-SUFFICIENT: a credential family theCOMMENT
LOWtests/cassette_patterns.py1221# JSON scalar* (``"field":"<one-pure-token>"``) — which is exactly the shape aCOMMENT
LOWtests/cassette_patterns.py1241# hex literal (a 32-hex MD5 or a 36-char UUID stays well under the floor).COMMENT
LOWtests/cassette_patterns.py1461 continueCOMMENT
LOWtests/cassette_patterns.py1481 # appear, regardless of the WIZ field name carrying them. Any surviving rawCOMMENT
LOWtests/cassette_patterns.py1501# =============================================================================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_public_api_behavior.py61 NotebookNotFoundError,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_cookie_save_race.py1721 monkeypatch.setattr(_lifecycle.asyncio, "to_thread", fake_to_thread)COMMENT
LOWtests/unit/test_user_settings_api.py141# ---------------------------------------------------------------------------COMMENT
LOWtests/unit/test_atomic_update_json.py321# Lock-path derivation contract (#1220)COMMENT
LOWtests/unit/test_playwright_domain_filter.py221def test_acceptance_sibling_domains_all_rejected_by_default(domain: str) -> None:COMMENT
LOWtests/unit/test_json_error_exit.py601 # notebook create: with_client + RuntimeError -> UNEXPECTED_ERROR envelope.COMMENT
LOWtests/unit/test_rpc_health_coverage.py61# ---------------------------------------------------------------------------COMMENT
LOWtests/unit/test_rpc_health_coverage.py81 "CREATE_ARTIFACT",COMMENT
LOWtests/unit/test_runtime_lifecycle.py121 self._drain_tracker.run_drain_hooks = AsyncMock()COMMENT
LOWtests/unit/test_runtime_lifecycle.py141 # the new loop. The ``MagicMock`` default lets both calls landCOMMENT
301 more matches not shown…
Modern Structural Boilerplate266 hits · 269 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_json_stdout_purity.py400def _setup_fs_doctor(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/test_json_stdout_purity.py429def _setup_fs_profile_list(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/unit/test_auth_session_headless_reauth.py66 async def update_auth_tokens(self, *, auth: AuthTokens, csrf: str, session_id: str) -> None:CODE
LOWtests/unit/test_auth_session_headless_reauth.py71 def update_auth_headers(self, *, auth: AuthTokens, kernel: Any) -> None:CODE
LOWtests/unit/test_auth_cookie_save_race.py87def _set_cookie_value(jar: httpx.Cookies, name: str, value) -> None:CODE
LOWtests/unit/test_auth_session.py100 async def update_auth_tokens(self, *, auth: AuthTokens, csrf: str, session_id: str) -> None:CODE
LOWtests/unit/test_auth_session.py105 def update_auth_headers(self, *, auth: AuthTokens, kernel: Any) -> None:CODE
LOWtests/unit/mcp/conftest.py124__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.py210 def _setup(c: Any) -> None:CODE
LOWtests/unit/cli/test_cli_mcp_parity.py225 def _setup(c: Any) -> None:CODE
LOWtests/_baselines/registry.py209__all__ = [CODE
LOWtests/_baselines/__init__.py20__all__ = ["BASELINES", "Baseline"]CODE
LOWtests/integration/cli_vcr/_cassette_expectations.py304__all__ = [CODE
LOWtests/integration/cli_vcr/conftest.py59__all__ = [CODE
LOWtests/integration/cli_vcr/_fixtures.py71__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.py144 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.py308 async def set_mode(self, notebook_id: str, mode: Any) -> None:CODE
LOWtests/server/fakes.py724 def set_research_failed(self, notebook_id: str, poll_id: str, *, query: str = "q") -> None:CODE
LOWtests/_fixtures/chain.py122__all__ = [CODE
LOWtests/_fixtures/__init__.py22__all__ = [CODE
LOWsrc/notebooklm/_sharing.py10logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_research.py49__all__ = [CODE
LOWsrc/notebooklm/_research.py58logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/auth.py64logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/auth.py136__all__ = [CODE
LOWsrc/notebooklm/_rpc_executor.py5__all__ = ["DecodeResponse", "RpcExecutor"]CODE
LOWsrc/notebooklm/_rpc_executor.py55logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_research_task_parser.py32__all__ = [CODE
LOWsrc/notebooklm/_research_task_parser.py44logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_reqid_counter.py115 def set_value(self, new_value: int) -> None:CODE
LOWsrc/notebooklm/_reqid_counter.py182__all__ = ["DEFAULT_BASELINE", "DEFAULT_STEP", "ReqidCounter"]CODE
LOWsrc/notebooklm/_notes.py28logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_request_types.py110__all__ = [CODE
LOWsrc/notebooklm/_logging.py33__all__ = [CODE
LOWsrc/notebooklm/config.py17__all__ = [CODE
LOWsrc/notebooklm/_auth_refresh_retry.py168__all__ = ["RefreshBudget", "refresh_and_count"]CODE
LOWsrc/notebooklm/_serving.py20__all__ = [CODE
LOWsrc/notebooklm/_transport_errors.py5__all__ = [CODE
LOWsrc/notebooklm/_idempotency_policy.py6__all__ = ["register_default_policies"]CODE
LOWsrc/notebooklm/paths.py44logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/paths.py52__all__ = [CODE
LOWsrc/notebooklm/paths.py72def set_active_profile(profile: str | None) -> None:CODE
LOWsrc/notebooklm/research.py19logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/research.py144__all__ = [CODE
LOWsrc/notebooklm/log.py9__all__ = ["install_redaction"]CODE
LOWsrc/notebooklm/_streaming_post.py5__all__ = [CODE
LOWsrc/notebooklm/_transport_drain.py54logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_transport_drain.py324__all__ = ["TransportDrainTracker", "_TransportOperationToken"]CODE
LOWsrc/notebooklm/client.py89__all__ = ["NotebookLMClient"]CODE
LOWsrc/notebooklm/client.py91logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_idempotency.py54logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm/_idempotency.py487__all__ = [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
206 more matches not shown…
Cross-File Repetition31 hits · 155 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
Deep Nesting153 hits · 140 pts
SeverityFileLineSnippetContext
LOWtests/cassette_patterns.py564CODE
LOWtests/vcr_config.py565CODE
LOWtests/vcr_config.py617CODE
LOWtests/unit/test_streaming_chat_wire.py770CODE
LOWtests/unit/test_concurrency_refresh_race.py419CODE
LOWtests/unit/test_sources_row_adapter.py72CODE
LOWtests/unit/test_init_order.py171CODE
LOWtests/unit/test_rpc_types.py23CODE
LOWtests/unit/test_rpc_overrides.py61CODE
LOWtests/unit/cli/test_quiet_enforcement.py99CODE
LOWtests/_guardrails/test_middleware_context_contract.py96CODE
LOWtests/_guardrails/test_no_session.py60CODE
LOWtests/_guardrails/test_cli_boundary.py270CODE
LOWtests/_guardrails/test_cli_boundary.py301CODE
LOWtests/_guardrails/test_cli_boundary.py334CODE
LOWtests/_guardrails/test_cli_boundary.py435CODE
LOWtests/_guardrails/test_cli_boundary.py560CODE
LOWtests/_guardrails/test_cli_boundary.py671CODE
LOWtests/_guardrails/test_error_handler_allowlist.py104CODE
LOWtests/_guardrails/test_public_surface.py205CODE
LOWtests/_guardrails/test_no_session_compat_bridges.py165CODE
LOWtests/_guardrails/test_type_boundaries.py59CODE
LOWtests/_guardrails/test_type_boundaries.py134CODE
LOWtests/_guardrails/test_type_boundaries.py162CODE
LOWtests/_guardrails/test_type_boundaries.py185CODE
LOWtests/_guardrails/test_cli_rpc_envelope.py90CODE
LOWtests/_guardrails/test_cli_rpc_envelope.py127CODE
LOWtests/_guardrails/test_cli_rpc_envelope.py178CODE
LOWtests/_guardrails/test_server_boundary.py44CODE
LOWtests/_guardrails/test_app_boundary.py116CODE
LOWtests/_guardrails/test_golden_decode_coverage.py318CODE
LOW…sts/_guardrails/test_no_inline_deprecation_warnings.py53CODE
LOWtests/_guardrails/test_mcp_boundary.py46CODE
LOWtests/_guardrails/test_session_runtime_boundaries.py164CODE
LOWtests/_guardrails/test_session_runtime_boundaries.py261CODE
LOWtests/_guardrails/test_session_runtime_boundaries.py331CODE
LOWtests/_guardrails/test_no_cross_test_imports.py50CODE
LOWtests/_guardrails/test_client_composition.py96CODE
LOWtests/_guardrails/test_public_surface_manifest.py590CODE
LOW…sts/_guardrails/test_no_legacy_rpc_callable_aliases.py73CODE
LOW…sts/_guardrails/test_no_legacy_rpc_callable_aliases.py95CODE
LOWtests/_guardrails/test_install_docs.py88CODE
LOWtests/_guardrails/test_install_docs.py215CODE
LOWtests/_guardrails/test_source_policy_parity.py42CODE
LOWtests/_guardrails/test_rpc_method_ids_only_in_types.py47CODE
LOWtests/_guardrails/test_rpc_method_ids_only_in_types.py91CODE
LOWtests/_guardrails/test_no_core_imports.py73CODE
LOWtests/_guardrails/test_no_bare_tests_root_imports.py55CODE
LOWtests/_guardrails/test_asyncio_loop_affinity_guard.py283CODE
LOWtests/integration/test_research_deep_poll_vcr.py370CODE
LOWtests/integration/test_research_deep_poll_vcr.py485CODE
LOWtests/integration/test_sources_integration.py1817CODE
LOWtests/integration/cli_vcr/_cassette_expectations.py117CODE
LOWtests/integration/cli_vcr/_cassette_expectations.py178CODE
LOWtests/integration/concurrency/helpers.py55CODE
LOWtests/integration/mcp_vcr/test_artifacts.py73CODE
LOWtests/server/fakes.py192CODE
LOWtests/scripts/check_cassettes_clean.py226CODE
LOWtests/scripts/compress_polling_cassette.py120CODE
LOWtests/e2e/conftest.py527CODE
93 more matches not shown…
Excessive Try-Catch Wrapping117 hits · 121 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_windows_compatibility.py315 except Exception as e:CODE
LOWtests/unit/cli/test_cli_mcp_parity.py171 except Exception as exc: # noqa: BLE001 - caller classifies (see _mcp_capture)CODE
LOWtests/unit/concurrency/test_close_cancellation_leak.py368 except Exception:CODE
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.py142 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/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.py98def _ask_with_skip(*args, **kwargs):CODE
LOWtests/e2e/conftest.py688 except Exception as e:CODE
LOWtests/e2e/conftest.py749 except Exception:CODE
LOWtests/e2e/conftest.py864 except Exception:CODE
LOWtests/e2e/conftest.py873 except Exception:CODE
LOWtests/e2e/conftest.py942 except Exception as e:CODE
LOWtests/e2e/conftest.py968 except Exception:CODE
LOWtests/e2e/conftest.py986 except Exception:CODE
LOWtests/e2e/conftest.py1138 except Exception as e:CODE
LOWtests/e2e/conftest.py829 except Exception:CODE
LOWtests/e2e/conftest.py831 except Exception:CODE
LOWtests/e2e/conftest.py842 except Exception:CODE
LOWtests/e2e/conftest.py844 except Exception:CODE
LOWtests/e2e/conftest.py1076 except Exception:CODE
LOWtests/e2e/conftest.py1078 except Exception:CODE
LOWtests/e2e/test_downloads.py133 except Exception:CODE
LOWdocs/rpc-reference.md155 except Exception: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.py130 except Exception as e:CODE
LOWscripts/mcp_live_smoke.py195 except Exception as exc: # noqa: BLE001 - top-level smoke wants one clean lineCODE
LOWscripts/audit_public_api_compat.py217 except Exception:CODE
LOWscripts/audit_public_api_compat.py402 except Exception as exc:CODE
LOWscripts/_onetime_rescrub_cookies.py129 except Exception as exc: # noqa: BLE001CODE
LOWscripts/check_rpc_health.py1224 except Exception as e:CODE
LOWscripts/check_rpc_health.py1240 except Exception as e:CODE
LOWscripts/check_rpc_health.py1256 except Exception as e:CODE
LOWscripts/check_rpc_health.py1265 except Exception as e:CODE
LOWsrc/notebooklm/_auth_refresh_retry.py147 except Exception as refresh_error:CODE
LOWsrc/notebooklm/client.py529 except Exception as close_exc:CODE
LOWsrc/notebooklm/_curl_cffi_transport.py155 except Exception: # noqa: BLE001 — cleanup must not mask the original errorCODE
LOWsrc/notebooklm/_notebooks.py536 except Exception:CODE
LOWsrc/notebooklm/_notebooks.py585 except Exception:CODE
LOWsrc/notebooklm/_notebooks.py630 except Exception:CODE
LOWsrc/notebooklm/_notebooks.py644 except Exception:CODE
MEDIUMsrc/notebooklm/_notebooks.py543def _create() -> Notebook:CODE
LOWsrc/notebooklm/_client_metrics.py143 except Exception as exc: # noqa: BLE001 - observability must not alter behaviorCODE
LOWsrc/notebooklm/_atomic_io.py280 except Exception:CODE
LOWsrc/notebooklm/_atomic_io.py284 except Exception as cleanup_err:CODE
LOWsrc/notebooklm/_note_service.py367 except Exception: # noqa: BLE001 — log and proceed to deleteCODE
LOWsrc/notebooklm/_note_service.py410 except Exception: # noqa: BLE001 — best-effort cleanup, must not surfaceCODE
LOWsrc/notebooklm/_middleware/metrics.py104 except Exception as exc:CODE
LOWsrc/notebooklm/_middleware/tracing.py113 except Exception as exc:CODE
LOWsrc/notebooklm/_chat/wire.py487 except Exception:CODE
LOWsrc/notebooklm/_auth/headless_reauth.py660 except Exception as exc: # noqa: BLE001 - recovery is best-effortCODE
LOWsrc/notebooklm/_auth/psidts_recovery.py459 except Exception as exc: # noqa: BLE001 - persistence failure is non-fatal hereCODE
57 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.py390# so the mock-client harness can't drive them. The parametrized sweepCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py632 # the mock-client harness. `notebook_create` goes through the standardCOMMENT
MEDIUMtests/unit/test_json_stdout_purity.py657 # harness — they read NOTEBOOKLM_HOME directly. Stage a clean layoutCOMMENT
MEDIUMtests/unit/test_auth_cookie_save_race.py1738 # order) to stay robust across schedulers.COMMENT
MEDIUMtests/unit/test_row_adapters.py1062 # TZ-robust: compare the round-tripped epoch, not a wall-time string.COMMENT
MEDIUMtests/unit/test_json_error_exit.py704 # then invoke without the mock-client harness (these commands don'tCOMMENT
MEDIUMtests/unit/test_json_error_exit.py679# Filesystem-driven failure cases bypass the mock-client harness — theyCOMMENT
MEDIUMtests/unit/test_sources_upload_delegation.py52 # parse bytecode. ``casefold()`` makes the suffix check robust onCOMMENT
MEDIUMtests/unit/test_rpc_golden_payloads.py1237# 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.py351 # The ``browser`` extra is installed in CI; pin it so the test is robustCOMMENT
MEDIUMtests/unit/cli/test_login.py309 # 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.py54# 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.py78# is robust to nested ``[...]`` in the options array (a single forward regexCOMMENT
LOWsrc/notebooklm/_sharing.py128 # Fetch current status and override view_level with what we just setCOMMENT
MEDIUMsrc/notebooklm/_atomic_io.py355 # and re-introduce the divergent-lock race. ``casefold`` is the robustCOMMENT
MEDIUMsrc/notebooklm/_app/doctor.py116 # Reuse the shared, name-robust extractor (drops non-dict rows andCOMMENT
Structural Annotation Overuse36 hits · 66 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_cookie_domain_split.py400 # Step 2: storage_state → DomainCookieMap (used by AuthTokens).COMMENT
LOWtests/unit/test_cookie_domain_split.py406 # Step 3: storage_state → httpx jar (used by downloads + refresh).COMMENT
LOWtests/unit/test_cookie_domain_split.py414 # Step 4: the runtime gate itself accepts every YouTube variant.COMMENT
LOWtests/unit/test_cookie_domain_split.py389 # Step 1: rookiepy → storage_state conversion must keep the YouTubeCOMMENT
LOWtests/integration/test_sources_integration.py814 # Step 0: register_file_source captures a baseline GET_NOTEBOOKCOMMENT
LOWtests/integration/test_sources_integration.py817 # Step 1: Mock RPC registration response (o4cbdc)COMMENT
LOWtests/integration/test_sources_integration.py827 # Step 2: Mock upload session start responseCOMMENT
LOWtests/integration/test_sources_integration.py837 # Step 3: Mock upload finalize responseCOMMENT
LOWtests/integration/test_sources_integration.py1031 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py1033 # Step 1: Mock RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py1043 # Step 2: Mock upload session startCOMMENT
LOWtests/integration/test_sources_integration.py1053 # Step 3: Mock upload finalizeCOMMENT
LOWtests/integration/test_sources_integration.py2791 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py2793 # Step 1: Successful RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py2803 # 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.md468# Step 1: Install bird (macOS/Linux)COMMENT
LOWdocs/troubleshooting.md471# Step 2: Fetch X.com content as markdownCOMMENT
LOWdocs/troubleshooting.md474# Step 3: Add the local markdown file to NotebookLMCOMMENT
LOWdocs/rpc-development.md250### Step 1: CaptureCOMMENT
LOWdocs/rpc-development.md259### Step 2: DecodeCOMMENT
LOWdocs/rpc-development.md277### Step 3: ImplementCOMMENT
LOWdocs/rpc-development.md326### Step 4: TestCOMMENT
LOWdocs/rpc-development.md357### 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
Fake / Example Data60 hits · 62 pts
SeverityFileLineSnippetContext
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.py168 account_email="user@example.com",CODE
LOWtests/unit/test_chat_ask_invariants.py189 assert _extract_query_param(str(request.url), "authuser") == "user@example.com"CODE
LOWtests/unit/test_artifact_generation_prompt.py101 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.py16 data = ["user@example.com", 3, [], ["Test User", "https://avatar.url"]]CODE
LOWtests/unit/test_sharing_types.py19 assert user.email == "user@example.com"CODE
LOWtests/unit/test_sharing_types.py43 data = ["user@example.com", 2, []]CODE
LOWtests/unit/test_sharing_types.py46 assert user.email == "user@example.com"CODE
LOWtests/unit/test_sharing_types.py53 data = ["user@example.com", 99, []]CODE
LOWtests/unit/test_sharing_types.py60 data = ["user@example.com", {"permission": 3}, []]CODE
LOWtests/unit/test_sharing_types.py106 data = ["user@example.com", 3, [], ["Just Name"]]CODE
LOWtests/unit/test_sharing_types.py243 ["user@example.com", 3, [], ["Name", "https://avatar"]], # fullCODE
LOWtests/unit/test_sharing_types.py244 ["user@example.com", 2, []], # minimal (no user_info slot)CODE
LOWtests/unit/test_sharing_types.py245 ["user@example.com", 3, [], ["Just Name"]], # partial user_info (no avatar)CODE
LOWtests/unit/test_sharing_types.py246 ["user@example.com", 99, []], # unknown permissionCODE
LOWtests/unit/test_sharing_types.py247 ["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.py166 ["share", "add", "user@example.com", "-n", "nb_123"],CODE
LOWtests/unit/cli/test_share.py175 "user@example.com",CODE
LOWtests/unit/cli/test_share.py196 ["share", "add", "user@example.com", "-n", "nb_123", "-p", "editor"],CODE
LOWtests/unit/cli/test_share.py204 "user@example.com",CODE
LOWtests/unit/cli/test_share.py232 ["share", "remove", "user@example.com", "-n", "nb_123", "-y"],CODE
LOWtests/unit/cli/test_share.py238 mock_client.sharing.remove_user.assert_called_once_with("nb_123", "user@example.com")CODE
LOWtests/unit/cli/test_share.py279 ["share", "remove", "user@example.com", "-n", "nb_123", "--json"],CODE
LOWtests/unit/cli/test_share.py284 assert '"removed_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py304 ["share", "remove", "user@example.com", "-n", "nb_123", "--json"],CODE
LOWtests/unit/cli/test_share.py309 assert '"removed_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py311 mock_client.sharing.remove_user.assert_called_once_with("nb_123", "user@example.com")CODE
LOWtests/unit/cli/test_share.py477 assert '"updated_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py548 ["share", "add", "user@example.com", "-n", "nb_123", "--json"],CODE
LOWtests/unit/cli/test_share.py553 assert '"added_user": "user@example.com"' in result.outputCODE
LOWtests/unit/cli/test_share.py255 ["share", "remove", "user@example.com", "-n", "nb_123"],CODE
LOWtests/unit/cli/test_share.py437 ["share", "update", "user@example.com", "-n", "nb_123", "-p", "editor"],CODE
LOWtests/unit/cli/test_share.py445 "nb_123", "user@example.com", SharePermission.EDITORCODE
LOWtests/unit/cli/test_share.py466 "user@example.com",CODE
LOWtests/unit/cli/test_session_characterization.py200 result = char_runner.invoke(cli, ["login", "--account", "user@example.com"])CODE
LOWtests/integration/test_sharing_integration.py342 ["user@example.com", 2, [], ["User", "https://avatar"]], # Now editorCODE
LOWtests/integration/test_sharing_integration.py353 "user@example.com",CODE
LOWtests/server/fakes.py657 self.account_email: str | None = "user@example.com"CODE
LOWtests/server/test_meta.py29 self.details = {"account": {"email": "user@example.com", "authuser": 0}}CODE
LOWtests/server/test_meta.py186 assert account["email"] == "user@example.com"CODE
LOWtests/server/test_meta.py199 assert account["email"] == "user@example.com"CODE
LOWtests/server/test_meta.py225 assert account["email"] == "user@example.com"CODE
LOWdocs/rpc-reference.md1995await client.sharing.add_user(notebook_id, "user@example.com", SharePermission.VIEWER)CODE
LOWscripts/check_rpc_health.py571 return [[notebook_id], [["placeholder"]]]CODE
LOWscripts/check_rpc_health.py574 return [[notebook_id], "placeholder", "New Title"]CODE
LOWscripts/check_rpc_health.py582 return [[notebook_id], "placeholder"]CODE
LOWscripts/check_rpc_health.py585 return [[notebook_id], "placeholder", "New Name"]CODE
LOWscripts/check_rpc_health.py588 return [[notebook_id], "placeholder", 1]CODE
LOWscripts/check_rpc_health.py611 return [[notebook_id], "placeholder", "Updated", "Updated content"]CODE
LOWscripts/check_rpc_health.py619 return [[notebook_id], "placeholder", True]CODE
LOWsrc/notebooklm/_sharing.py30 "user@example.com",STRING
Modern AI Meta-Vocabulary19 hits · 54 pts
SeverityFileLineSnippetContext
MEDIUMtests/unit/test_concurrency_refresh_race.py79# Test-side deadline for any single asyncio.Event in the race scaffolding.COMMENT
MEDIUMtests/unit/test_concurrency_refresh_race.py460 # Build the same auth scaffold the unit conftest's ``make_core`` producesCOMMENT
MEDIUMtests/unit/test_check_rpc_health.py573# The streamed-chat orchestration RPC has no obfuscated method ID to echo backCOMMENT
MEDIUMtests/unit/test_drive_import.py436# DriveImportService — orchestration, cleanup, second defenseCOMMENT
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/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.md1079│ ├── source_clean.py # Click-free `source clean` core: junk-source classification + batched-deletion orchestCODE
MEDIUMdocs/adr/0013-composable-session-capabilities.md254- **C-Z. AST-based delegate-surface regression guard** *(historical)* — introduced by PR [#885](https://github.com/teng-CODE
MEDIUMdocs/adr/0013-composable-session-capabilities.md254- **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.md208### Rule 4 — `Session` retains only orchestration plus the documented middleware-chain seamsCOMMENT
MEDIUMscripts/check_rpc_health.py1349 # Probe the streamed-chat orchestration RPC. It is not anCOMMENT
MEDIUMsrc/notebooklm/_notebook_payloads.py30# 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.py400 # Step 2: storage_state → DomainCookieMap (used by AuthTokens).COMMENT
LOWtests/unit/test_cookie_domain_split.py406 # Step 3: storage_state → httpx jar (used by downloads + refresh).COMMENT
LOWtests/unit/test_cookie_domain_split.py414 # Step 4: the runtime gate itself accepts every YouTube variant.COMMENT
LOWtests/unit/test_cookie_domain_split.py389 # Step 1: rookiepy → storage_state conversion must keep the YouTubeCOMMENT
LOWtests/integration/test_sources_integration.py814 # Step 0: register_file_source captures a baseline GET_NOTEBOOKCOMMENT
LOWtests/integration/test_sources_integration.py817 # Step 1: Mock RPC registration response (o4cbdc)COMMENT
LOWtests/integration/test_sources_integration.py827 # Step 2: Mock upload session start responseCOMMENT
LOWtests/integration/test_sources_integration.py837 # Step 3: Mock upload finalize responseCOMMENT
LOWtests/integration/test_sources_integration.py1031 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py1033 # Step 1: Mock RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py1043 # Step 2: Mock upload session startCOMMENT
LOWtests/integration/test_sources_integration.py1053 # Step 3: Mock upload finalizeCOMMENT
LOWtests/integration/test_sources_integration.py2791 # Step 0: Baseline GET_NOTEBOOK for the register_file_source probe wrapper.COMMENT
LOWtests/integration/test_sources_integration.py2793 # Step 1: Successful RPC registrationCOMMENT
LOWtests/integration/test_sources_integration.py2803 # 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
Self-Referential Comments16 hits · 43 pts
SeverityFileLineSnippetContext
MEDIUMtests/unit/test_artifact_downloads.py756 # Create the complex nested structure for data table.COMMENT
MEDIUMtests/unit/test_sources_upload.py937 # 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.py360 # Create a temp fileCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py760 # Create a test fileCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py850 # Create a source to deleteCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py888 # Create a notebook to deleteCOMMENT
MEDIUMtests/integration/test_vcr_comprehensive.py920 # 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.py170 notebooklm create "My Notes" # Create a notebookSTRING
MEDIUMsrc/notebooklm/_auth/browser_capture.py839 # Create a TEMPORARY page we own for the navigation, and close ONLYCOMMENT
MEDIUMsrc/notebooklm/_auth/master_token.py299 # Create the temp at 0600 from the start (don't widen-then-chmod) — this is aCOMMENT
Hallucination Indicators3 hits · 35 pts
SeverityFileLineSnippetContext
CRITICALtests/unit/mcp/test_studio.py1160 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
Synthetic Comment Markers3 hits · 26 pts
SeverityFileLineSnippetContext
HIGHdocs/python-api.md989# Get AI-generated description (parsed with suggested topics)COMMENT
HIGHdocs/python-api.md1082# Get AI-generated summary and keywords (returns a typed SourceGuide)COMMENT
HIGHexamples/video.py51 # - CINEMATIC: AI-generated documentary footage (Veo 3)COMMENT
Redundant / Tautological Comments10 hits · 16 pts
SeverityFileLineSnippetContext
LOWtests/unit/test_windows_compatibility.py264 # Check if UTF-8 mode is active (either via flag or env var)COMMENT
LOWtests/unit/test_auth_storage.py137 # 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.py695 # Check if error response still contains our expected IDCOMMENT
LOWscripts/check_rpc_health.py712 # Check if expected ID is in responseCOMMENT
LOW.github/workflows/nightly.yml56 # Check if it's main or a release branchCOMMENT
LOWsrc/notebooklm/_auth/refresh.py748 # Check if we were redirected to loginCOMMENT
LOWsrc/notebooklm/_auth/cookie_policy.py592 # Check if it's a valid Google domain (base or regional)COMMENT
LOWsrc/notebooklm/_auth/cookie_policy.py606 # Check if domain is a subdomain of allowed suffixesCOMMENT
LOWsrc/notebooklm/_app/chat.py121 # Check if the user switched notebooks via the --notebook flag. Only readCOMMENT
AI Structural Patterns12 hits · 10 pts
SeverityFileLineSnippetContext
LOWtests/_helpers/client_factory.py29CODE
LOWtests/unit/test_rpc_golden_payloads.py1457CODE
LOWtests/unit/cli/test_playwright_login_render_contract.py150CODE
LOWsrc/notebooklm/_client_assembly.py92CODE
LOWsrc/notebooklm/client.py157CODE
LOWsrc/notebooklm/client.py594CODE
LOWsrc/notebooklm/exceptions.py411CODE
LOWsrc/notebooklm/mcp/tools/studio.py276CODE
LOWsrc/notebooklm/mcp/tools/sources.py438CODE
LOWsrc/notebooklm/mcp/tools/sources.py625CODE
LOWsrc/notebooklm/cli/resolve.py192CODE
LOWsrc/notebooklm/_runtime/init.py481CODE
Dead Code3 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMtests/server/conftest.py67CODE
MEDIUMtests/server/test_app_lifecycle.py111CODE
MEDIUMtests/server/test_sources.py90CODE