AI Slop Code RIsk Monitor

jacob-bd/gemini-notebook-mcp-cli

Programmatic access to Gemini Notebook - via command-line interface (CLI), Model Context Protocol (MCP) server, and AI agent skills.

50.0 High pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for jacob-bd/gemini-notebook-mcp-cli, a Python project with 6,281 GitHub stars. SynthScan examined 106,015 lines of code across 353 source files, recording 3285 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 50.0 (High pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

50.0
Adjusted Signal
50.0
Raw Pattern Score
100%
Time Factor
2026-10-06
Last Push
6.3K
Stars
Python
Language
106.0K
Lines of Code
353
Files
3.3K
Pattern Hits
2026-10-12
Scan Date
0.77
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 73.3/100 · HIGH

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

Hallucinated Dependency & Supply Chain Risk 40.4/100 · MEDIUM

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

Agent Over-Engineering Ratio 80.1/100 · CRITICAL

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

PR Review Velocity Impact 92.1/100 · CRITICAL

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

What These Metrics Mean

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

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 62HIGH 209MEDIUM 242LOW 2772

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

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

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers1932 hits · 1990 pts
SeverityFileLineSnippetContext
LOWtests/test_api_client.py80 def test_auth_recovery_reports_unreachable_backend(self, mock_client):CODE
LOWtests/test_api_client.py103 def test_auth_recovery_keeps_expiry_as_authentication_failure(self, mock_client):CODE
LOWtests/test_api_client.py161 def test_refresh_auth_tokens_success(self, mock_client):CODE
LOWtests/test_api_client.py184 def test_refresh_auth_tokens_redirect_login(self, mock_client):CODE
LOWtests/test_api_client.py201 def test_get_notebook_sources_extracts_url(self, mock_client):CODE
LOWtests/test_api_client.py245 def test_add_drive_source_uses_extended_timeout(self, mock_client):CODE
LOWtests/test_api_client.py270 def test_add_drive_source_timeout_returns_status(self, mock_client):CODE
LOWtests/test_wsl.py13def test_get_windows_host_ip_uses_loopback_in_mirrored_mode(monkeypatch):CODE
LOWtests/test_wsl.py29def test_get_windows_host_ip_uses_gateway_in_nat_mode(monkeypatch):CODE
LOWtests/test_wsl.py59def test_get_windows_host_ip_uses_gateway_when_wslinfo_is_unavailable(monkeypatch):CODE
LOWtests/test_wsl.py72def test_launch_windows_chrome_preserves_non_ascii_windows_temp_path(monkeypatch):CODE
LOW⚡tests/test_coerce_list.py14 def test_serialized_json_null_returns_none(self):CODE
LOW⚡tests/test_coerce_list.py18 def test_serialized_json_null_list_returns_none(self, value):CODE
LOW⚡tests/test_coerce_list.py21 def test_empty_string_returns_none(self):CODE
LOW⚡tests/test_coerce_list.py25 def test_actual_list_passthrough(self):CODE
LOW⚡tests/test_coerce_list.py31 def test_comma_separated_string(self):CODE
LOW⚡tests/test_coerce_list.py34 def test_comma_separated_with_spaces(self):CODE
LOW⚡tests/test_coerce_list.py44 def test_int_list_passthrough(self):CODE
LOW⚡tests/test_coerce_list.py50 def test_list_of_strings_cast_to_int(self):CODE
LOW⚡tests/test_coerce_list.py53 def test_empty_list_returns_empty(self):CODE
LOW⚡tests/test_coerce_list.py56 def test_malformed_json_falls_back_to_comma(self):CODE
LOW⚡tests/test_coerce_list.py62async def test_mcp_list_parameters_accept_string_values():CODE
LOWtests/test_cdp_headless_port.py11def test_headless_auth_uses_free_port_when_launching():CODE
LOWtests/test_cdp_headless_port.py26def test_headless_auth_keeps_best_effort_port_failure_compatible():CODE
LOWtests/test_cdp_headless_port.py42def test_headless_auth_can_surface_safe_port_failure():CODE
LOWtests/test_cdp_headless_port.py65def test_headless_auth_reports_unsigned_saved_profile_for_explicit_refresh():CODE
LOWtests/test_cdp_headless_port.py86def test_headless_auth_keeps_unsigned_saved_profile_best_effort_compatible():CODE
LOWtests/test_cdp_headless_port.py99def test_headless_auth_reports_candidate_rejection_for_explicit_refresh():CODE
LOWtests/test_research_polling.py17 def test_poll_research_filtering(self, mock_client):CODE
LOWtests/conftest.py10def _is_allowed_live_modification(rel_path: str) -> bool:CODE
LOWtests/test_debug_artifacts.py13def test_save_dom_capture_defaults_outside_the_repository(tmp_path, monkeypatch):CODE
LOWtests/test_debug_artifacts.py24def test_save_dom_capture_honors_explicit_output_path(tmp_path):CODE
LOWtests/test_debug_artifacts.py33def test_sensitive_debug_artifacts_are_ignored_by_git():CODE
LOWtests/test_config_session_profile.py21def test_override_changes_default_profile_everywhere():CODE
LOWtests/test_config_session_profile.py28def test_clearing_override_returns_to_saved_default():CODE
LOW⚡tests/test_config_session_profile.py42def test_save_config_never_persists_the_session_override():CODE
LOW⚡tests/test_config_session_profile.py48def test_saved_default_reads_file_only():CODE
LOW⚡tests/test_config_session_profile.py58def test_root_mirror_ignores_session_override():CODE
LOWtests/test_mcp_studio.py23def test_studio_status_is_lean_and_bounded_by_default():CODE
LOWtests/test_mcp_studio.py64def test_studio_status_can_request_one_detailed_artifact():CODE
LOWtests/test_mcp_studio.py95def test_studio_create_preserves_rate_limit_hint():CODE
LOWtests/test_mcp_studio.py124def test_studio_create_uses_configured_notebook_url():CODE
LOWtests/test_mcp_studio.py155def test_studio_revise_preserves_hint_on_service_error():CODE
LOWtests/test_mcp_studio.py184def test_studio_revise_uses_configured_notebook_url():CODE
LOWtests/test_mcp_studio.py215def test_report_rejects_unknown_action():CODE
LOWtests/test_mcp_studio.py221def test_report_get_keeps_success_envelope():CODE
LOWtests/test_mcp_studio.py234def test_report_elements_passes_wait_and_content():CODE
LOWtests/test_mcp_studio.py259def test_report_generate_validates_without_confirm():CODE
LOWtests/test_mcp_studio.py289def test_report_generate_runs_on_confirm_and_keeps_success_envelope():CODE
LOWtests/test_mcp_studio.py322def test_report_generate_requires_plan_and_rejects_bad_plan():CODE
LOWtests/test_mcp_studio.py342def test_old_report_tools_are_gone():CODE
LOWtests/test_mcp_server_version_cache.py17def test_successful_version_lookup_is_cached(monkeypatch):CODE
LOWtests/test_mcp_server_version_cache.py32def test_failed_lookup_uses_short_negative_cache(monkeypatch):CODE
LOWtests/test_mcp_server_version_cache.py50def test_success_cache_expires_after_ttl(monkeypatch):CODE
LOWtests/test_mcp_server_version_cache.py62def test_concurrent_calls_share_one_network_fetch(monkeypatch):CODE
LOWtests/test_mcp_e2e.py76 def test_notebook_create_rename_delete(self, mcp_tools):CODE
LOWtests/test_mcp_e2e.py132 def test_source_add_invalid_type(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py172 def test_studio_create_without_confirm(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py183 def test_studio_create_invalid_type(self, mcp_tools, test_notebook):CODE
LOWtests/test_mcp_e2e.py195 def test_studio_create_flashcards(self, mcp_tools, test_notebook):CODE
1872 more matches not shown…
Decorative Section Separators219 hits · 702 pts
SeverityFileLineSnippetContext
MEDIUM⚡tests/test_auth_migration.py145 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py147 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py161 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py163 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py289 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py291 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py339 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py341 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py397 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py399 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py450 # ------------------------------------------------------------------COMMENT
MEDIUM⚡tests/test_auth_migration.py452 # ------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_url_source_fallback.py16# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_url_source_fallback.py18# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_url_source_fallback.py51# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py53# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py180# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py182# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py243# ===========================================================================COMMENT
MEDIUMtests/core/test_url_source_fallback.py245# ===========================================================================COMMENT
MEDIUM⚡tests/core/test_task5_mcp_perf_caching.py374# =========================================================================COMMENT
MEDIUM⚡tests/core/test_task5_mcp_perf_caching.py376# =========================================================================COMMENT
MEDIUM⚡tests/core/test_task5_mcp_perf_caching.py635# =========================================================================COMMENT
MEDIUM⚡tests/core/test_task5_mcp_perf_caching.py637# =========================================================================COMMENT
MEDIUMtests/core/test_task5_mcp_perf_caching.py208# =========================================================================COMMENT
MEDIUMtests/core/test_task5_mcp_perf_caching.py210# =========================================================================COMMENT
MEDIUMtests/core/test_task5_mcp_perf_caching.py667 # ==========================================COMMENT
MEDIUMtests/core/test_task5_mcp_perf_caching.py669 # ==========================================COMMENT
MEDIUMtests/core/test_task5_mcp_perf_caching.py731 # ==========================================COMMENT
MEDIUMtests/core/test_task5_mcp_perf_caching.py733 # ==========================================COMMENT
MEDIUMtests/core/test_source_reconciliation.py16# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py18# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/core/test_source_reconciliation.py48# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/core/test_source_reconciliation.py50# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py117# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py119# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py173# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py175# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py207# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/core/test_source_reconciliation.py209# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py35# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py37# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py97# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py99# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py683# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py685# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py771# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py773# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py794# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_auth_health.py796# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py142# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py144# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py340# ---------------------------------------------------------------------------COMMENT
MEDIUMtests/services/test_auth_health.py342# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_download_containment.py158# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡tests/services/test_download_containment.py160# ---------------------------------------------------------------------------COMMENT
MEDIUMscripts/test_label_rpcs.py17# ─── Helpers ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/test_label_rpcs.py39# ─── Test client ─────────────────────────────────────────────────────────────COMMENT
MEDIUMscripts/test_label_rpcs.py108# ─── Main ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUM⚡src/notebooklm_tools/core/auth.py358# ============================================================================COMMENT
159 more matches not shown…
Hallucination Indicators62 hits · 635 pts
SeverityFileLineSnippetContext
CRITICALtests/test_cdp_headless_port.py44 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cdp_headless_port.py67 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cdp_headless_port.py101 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_browser.py438 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_browser.py478 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_browser.py506 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_browser.py520 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cdp_login_validation.py10from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_mcp_auth_studio_failures.py110 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICAL⚡tests/test_file_upload.py13from notebooklm_tools.core.exceptions import FileUploadError, FileValidationErrorCODE
CRITICALtests/test_cdp_url_check.py128 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cdp_url_check.py243 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cdp_profile_clear.py5from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_cookie_parsing.py9from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py508 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py530 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py553 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py576 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py594 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py613 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/test_auth_migration.py634 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/core/test_auth_check.py149 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/core/test_task3_routing_contract.py36from notebooklm_tools.core.exceptions import AccountMismatchErrorCODE
CRITICALtests/core/test_manual_login_host.py8from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICAL⚡tests/core/test_auth_guard.py3from notebooklm_tools.core.exceptions import AccountMismatchError, AuthenticationError, NLMErrorCODE
CRITICALtests/core/test_alias.py7from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALtests/core/test_sources.py296 from notebooklm_tools.core.exceptions import SourceProcessingErrorCODE
CRITICALtests/core/test_credential_store.py398 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/cli/test_login.py13 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/cli/test_login.py221 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALtests/cli/test_login_storage_choice.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALtests/cli/test_login_cancel_chrome.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALtests/services/test_sources.py316 from notebooklm_tools.core.exceptions import SourceProcessingErrorCODE
CRITICALsrc/notebooklm_tools/core/auth.py651 from notebooklm_tools.core.exceptions import AccountMismatchError, AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/core/auth.py910 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/core/auth.py1166 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/core/alias.py159 from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICAL⚡src/notebooklm_tools/core/auth_migration.py30from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/utils/firefox.py16from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/utils/cdp.py77from notebooklm_tools.core.exceptions import AuthenticationError # noqa: E402CODE
CRITICALsrc/notebooklm_tools/utils/browser.py8from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/utils/auth_browser.py7from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/mcp/tools/auth.py9from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/cli/utils.py89 from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py118 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py185 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py499 from notebooklm_tools.core.exceptions import AccountMismatchError, NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/main.py1003 from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/studio.py13from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/research.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/repl.py11from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/export.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/chat.py7from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/share.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/label.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/chats.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/notebook.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/source.py8from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/cli/commands/note.py9from notebooklm_tools.core.exceptions import NLMErrorCODE
CRITICALsrc/notebooklm_tools/services/auth.py670 from notebooklm_tools.core.exceptions import AuthenticationErrorCODE
2 more matches not shown…
Docstring Block Structure72 hits · 360 pts
SeverityFileLineSnippetContext
HIGHsrc/notebooklm_tools/core/exports.py32Export an artifact to Google Docs or Sheets. Args: notebook_id: The notebook UUID artifSTRING
HIGHsrc/notebooklm_tools/core/sharing.py164Add multiple collaborators to a notebook in a single API call. Args: notebook_id: The notebook UUIDSTRING
HIGHsrc/notebooklm_tools/core/studio.py1494Generate a Mind Map JSON from sources. This is step 1 of 2 for creating a mind map. After generation, uSTRING
HIGHsrc/notebooklm_tools/core/download.py145Download content from a URL to a local file with streaming support. Features: - Streams file in chunks STRING
HIGHsrc/notebooklm_tools/core/download.py941Parse rich-text data table into headers and rows. Features: - Validates structure at each navigation stSTRING
HIGHsrc/notebooklm_tools/core/download.py1291Fetch artifact HTML content for quiz/flashcard types. Args: notebook_id: The notebook ID. STRING
HIGHsrc/notebooklm_tools/core/download.py1359Extract JSON app data from interactive HTML. Quiz and flashcard HTML contains embedded JSON in a data-app-data STRING
HIGHsrc/notebooklm_tools/core/download.py1540Shared implementation for downloading quiz/flashcard artifacts. Args: notebook_id: The notebook ID.STRING
HIGHsrc/notebooklm_tools/core/download.py1640Download quiz artifact. Args: notebook_id: The notebook ID. output_path: Path to save tSTRING
HIGHsrc/notebooklm_tools/core/download.py1672Download flashcard deck artifact. Args: notebook_id: The notebook ID. output_path: PathSTRING
HIGHsrc/notebooklm_tools/core/constants.py32 Get integer code for a string name. Args: name: The string name (case-insensitive). STRING
HIGHsrc/notebooklm_tools/core/retry.py98Execute a callable with retry logic for transient server errors. Use this for one-off retry wrapping where a decoraSTRING
HIGHsrc/notebooklm_tools/core/sources.py161Wait for a source to finish processing. Polls the source status until it becomes READY or times out. NSTRING
HIGHsrc/notebooklm_tools/core/sources.py826Register a file source intent and get SOURCE_ID. Step 1 of the resumable upload protocol. Args: STRING
HIGHsrc/notebooklm_tools/core/sources.py873Start a resumable upload session and get the upload URL. Step 2 of the resumable upload protocol. ArgsSTRING
HIGHsrc/notebooklm_tools/core/sources.py976Add a local file as a source using resumable upload. Uses Google's resumable upload protocol: 1. RegistSTRING
HIGHsrc/notebooklm_tools/utils/wsl.py187Launch Chrome on Windows side from WSL. Args: port: Remote debugging port to use. debug: If True, cSTRING
HIGHsrc/notebooklm_tools/utils/cdp.py312Find an available loopback port for Chrome debugging. Scans the conventional CDP range first. If every candidate isSTRING
HIGHsrc/notebooklm_tools/utils/cdp.py1542Extract cookies and tokens from Chrome via CDP. This is the main entry point for CDP-based authentication. ArgSTRING
HIGHsrc/notebooklm_tools/utils/browser.py17 Parse cookies from a file. The file can contain: - Raw cookie header string (Cookie: name=value; name2=valSTRING
HIGHsrc/notebooklm_tools/cli/setup_safety.py57Create a private dated backup of an existing file or directory. Args: path: File or directory to back up. STRING
HIGHsrc/notebooklm_tools/cli/main.py165Validate saved credentials using the same policy as MCP auth recovery. The CLI previously treated a successful homeSTRING
HIGHsrc/notebooklm_tools/services/exports.py30Export a NotebookLM artifact to Google Docs or Sheets. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/sharing.py93Get sharing status and collaborators for a notebook. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/sharing.py125Enable or disable public link access. Args: client: Authenticated NotebookLM client notebook_id: NoSTRING
HIGHsrc/notebooklm_tools/services/sharing.py164Invite a collaborator by email. Args: client: Authenticated NotebookLM client notebook_id: NotebookSTRING
HIGHsrc/notebooklm_tools/services/sharing.py212Invite multiple collaborators in a single API call. Args: client: Authenticated NotebookLM client nSTRING
HIGHsrc/notebooklm_tools/services/labels.py56Auto-label all sources using AI-generated thematic categories. Requires 5+ sources. If labels already exist, returnSTRING
HIGHsrc/notebooklm_tools/services/labels.py89Force AI re-categorization of sources into new labels. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/labels.py118Create a new empty label manually. Args: client: Authenticated NotebookLM client notebook_id: NotebSTRING
HIGHsrc/notebooklm_tools/services/labels.py157Rename an existing label. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUID STRING
HIGHsrc/notebooklm_tools/services/labels.py196Set or clear the emoji marker on a label. Args: client: Authenticated NotebookLM client notebook_idSTRING
HIGHsrc/notebooklm_tools/services/labels.py234Assign a source to a label. Sources support multi-label assignment — this adds the source to the target label wSTRING
HIGHsrc/notebooklm_tools/services/labels.py275Delete one or more labels. Sources are NOT deleted. Args: client: Authenticated NotebookLM client nSTRING
HIGHsrc/notebooklm_tools/services/smart_select.py96Add tags to a notebook. Args: notebook_id: Notebook UUID tags: List of tags to add notebookSTRING
HIGHsrc/notebooklm_tools/services/smart_select.py150Remove tags from a notebook. Args: notebook_id: Notebook UUID tags: List of tags to remove RetSTRING
HIGHsrc/notebooklm_tools/services/smart_select.py205Select notebooks relevant to a query based on tags. Uses simple keyword matching: splits query into words and matchSTRING
HIGHsrc/notebooklm_tools/services/studio.py193Resolve a human-readable name to an integer code via constants.CodeMapper. Args: mapper: The CodeMapper insSTRING
HIGHsrc/notebooklm_tools/services/studio.py939Revise a slide deck with per-slide instructions. Creates a NEW artifact — the original is not modified. Args: STRING
HIGHsrc/notebooklm_tools/services/research.py211Start a research task to find new sources. Args: client: Authenticated NotebookLM client notebook_iSTRING
HIGHsrc/notebooklm_tools/services/research.py299Poll research progress, optionally blocking until complete or timeout. Args: client: Authenticated NotebookSTRING
HIGHsrc/notebooklm_tools/services/research.py425Import discovered sources from a completed research task. Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/notes.py49List all notes in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook USTRING
HIGHsrc/notebooklm_tools/services/notes.py78Create a new note in a notebook. Args: client: Authenticated NotebookLM client notebook_id: NotebooSTRING
HIGHsrc/notebooklm_tools/services/notes.py128Update a note's content and/or title. Args: client: Authenticated NotebookLM client notebook_id: NoSTRING
HIGHsrc/notebooklm_tools/services/notes.py179Delete a note permanently. Args: client: Authenticated NotebookLM client notebook_id: Notebook UUIDSTRING
HIGHsrc/notebooklm_tools/services/downloads.py337Download a non-streaming artifact synchronously. For: report, mind_map, data_table, data_table_xlsx, quiz, flashcarSTRING
HIGHsrc/notebooklm_tools/services/downloads.py465Download a streaming artifact asynchronously. For: audio, video, slide_deck, infographic, quiz, flashcards. ArSTRING
HIGHsrc/notebooklm_tools/services/downloads.py580Download every completed studio artifact of a notebook. Creates a subdirectory of ``output_dir`` named after the noSTRING
HIGHsrc/notebooklm_tools/services/downloads.py781Run download_all() over every notebook in the account. Each notebook gets its own subdirectory of ``output_dir``. ASTRING
HIGHsrc/notebooklm_tools/services/sources.py149Add a source to a notebook. Centralizes validation and routing for all source types. Args: client: AutSTRING
HIGHsrc/notebooklm_tools/services/sources.py307Add multiple sources to a notebook. URL sources are batched into a single API call for efficiency. Non-URL sourSTRING
HIGHsrc/notebooklm_tools/services/sources.py413List sources with Drive freshness status. Args: client: Authenticated NotebookLM client notebook_idSTRING
HIGHsrc/notebooklm_tools/services/sources.py506Sync Drive sources with latest content. Args: client: Authenticated NotebookLM client source_ids: SSTRING
HIGHsrc/notebooklm_tools/services/sources.py538Rename a source in a notebook. Args: client: Authenticated NotebookLM client notebook_id: Notebook STRING
HIGHsrc/notebooklm_tools/services/sources.py642Get AI-generated source summary with keywords. Args: client: Authenticated NotebookLM client sourceSTRING
HIGHsrc/notebooklm_tools/services/sources.py682Get raw text content of a source (no AI processing). Args: client: Authenticated NotebookLM client STRING
HIGHsrc/notebooklm_tools/services/chat.py240Query a notebook's sources with AI. Args: client: Authenticated NotebookLM client notebook_id: NoteSTRING
HIGHsrc/notebooklm_tools/services/chat.py323Configure notebook chat settings. Args: client: Authenticated NotebookLM client notebook_id: NoteboSTRING
HIGHsrc/notebooklm_tools/services/chat.py396Delete the chat history for a notebook. Fetches the notebook's persistent conversation ID, then deletes the assSTRING
12 more matches not shown…
Empty Error Handlers67 hits · 335 pts
SeverityFileLineSnippetContext
HIGHtests/conftest.py36except (OSError, ValueError):CODE
HIGHtests/test_file_upload.py406except Exception:CODE
HIGHtests/core/test_task5_mcp_perf_caching.py809except Exception:CODE
HIGHtests/cli/wizard_driver.py215except pexpect.TIMEOUT:CODE
HIGHsrc/notebooklm_tools/core/auth.py666except (json.JSONDecodeError, KeyError):CODE
HIGHsrc/notebooklm_tools/core/alias.py183except NLMError:CODE
HIGHsrc/notebooklm_tools/core/alias.py170except NLMError:CODE
HIGHsrc/notebooklm_tools/core/alias.py180except (NLMError, ServiceError, AttributeError):CODE
HIGHsrc/notebooklm_tools/core/auth_migration.py57except Exception:CODE
HIGHsrc/notebooklm_tools/core/studio.py656except Exception:CODE
HIGHsrc/notebooklm_tools/core/research.py400except Exception:CODE
HIGHsrc/notebooklm_tools/core/conversation.py605except (IndexError, TypeError):CODE
HIGHsrc/notebooklm_tools/core/conversation.py241except (IndexError, TypeError):CODE
HIGHsrc/notebooklm_tools/core/credential_store.py448except Exception:CODE
HIGHsrc/notebooklm_tools/core/credential_store.py459except Exception:CODE
HIGHsrc/notebooklm_tools/core/credential_store.py470except Exception:CODE
HIGHsrc/notebooklm_tools/core/credential_store.py1032except OSError:CODE
HIGHsrc/notebooklm_tools/core/sources.py147except Exception:CODE
HIGHsrc/notebooklm_tools/core/utils.py149except json.JSONDecodeError:CODE
HIGHsrc/notebooklm_tools/core/cdp_transport.py151except Exception:CODE
HIGHsrc/notebooklm_tools/core/base.py1164except AuthenticationError:CODE
HIGHsrc/notebooklm_tools/core/base.py753except json.JSONDecodeError:CODE
HIGHsrc/notebooklm_tools/core/base.py761except json.JSONDecodeError:CODE
HIGHsrc/notebooklm_tools/utils/config.py307except ImportError:CODE
HIGHsrc/notebooklm_tools/utils/config.py832except Exception:CODE
HIGHsrc/notebooklm_tools/utils/wsl.py74except (OSError, FileNotFoundError):CODE
HIGHsrc/notebooklm_tools/utils/wsl.py243except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py256except OSError:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py594except (OSError, RuntimeError):CODE
HIGHsrc/notebooklm_tools/utils/cdp.py623except (OSError, RuntimeError):CODE
HIGHsrc/notebooklm_tools/utils/cdp.py1046except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py1476except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py348except OSError:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py1286except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py1729except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py1780except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py2050except Exception:CODE
HIGHsrc/notebooklm_tools/utils/cdp.py1883except Exception:CODE
HIGHsrc/notebooklm_tools/utils/browser.py59except json.JSONDecodeError:CODE
HIGHsrc/notebooklm_tools/mcp/tools/_utils.py548except (json.JSONDecodeError, ValueError):CODE
HIGHsrc/notebooklm_tools/mcp/tools/_utils.py338except Exception:CODE
HIGHsrc/notebooklm_tools/cli/utils.py160except (json.JSONDecodeError, OSError):CODE
HIGHsrc/notebooklm_tools/cli/utils.py180except OSError:CODE
HIGHsrc/notebooklm_tools/cli/main.py589except (NLMError, ClientAuthenticationError):CODE
HIGHsrc/notebooklm_tools/cli/main.py1587except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/skill.py467except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/repl.py48except ValueError:CODE
HIGHsrc/notebooklm_tools/cli/commands/download.py502except ServiceError:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py118except (subprocess.SubprocessError, OSError):CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py453except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py872except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py888except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py904except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py923except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py948except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py978except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup_wizard.py870except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup.py1504except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup.py1336except Exception:CODE
HIGHsrc/notebooklm_tools/cli/commands/setup.py1089except (subprocess.TimeoutExpired, FileNotFoundError, OSError):CODE
7 more matches not shown…
Cross-Language Confusion55 hits · 320 pts
SeverityFileLineSnippetContext
HIGHtests/test_api_client.py25 # Signature: ["wrb.fr", "RPC_ID", null, null, null, [16], "generic"]COMMENT
HIGHtests/test_api_client.py34 # [[["wrb.fr", "rLM1Ne", null, null, null, [16], "generic"]]]COMMENT
HIGHtests/test_api_client.py205 # Source structure: [[id], title, metadata, [null, 2]]COMMENT
HIGHtests/test_file_upload.py105 mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","[[[[\\"source-id-123\\"]]]]",null,null,null,"generic"]]'CODE
HIGHtests/test_file_upload.py130 mock_response.text = ')]}\'\n100\n[["wrb.fr","o4cbdc","null",null,null,null,"generic"]]'CODE
HIGH⚡tests/core/test_conversation.py1062 # Table segment: [start, end, null, null, [dim1, dim2, rows_array]]COMMENT
HIGHtests/core/test_conversation.py782 # first_elem: [text, null, conv_data, null, type_info]COMMENT
HIGH⚡tests/core/test_conversation.py1061 """Table segments (nested=null, data at segment[4]) insert <cited_table>."""STRING
HIGHtests/core/test_sources.py51 mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[[]]",null,null,null,"generic"]]]'CODE
HIGHtests/core/test_sources.py74 mock_response.text = ')]}\'\n[[["wrb.fr","abcdef","[]",null,null,null,"generic"]]]'CODE
HIGH⚡tests/services/test_interactive_reports.py309 # Interactive reports store sources as [[["id"], null, 5], ...].COMMENT
HIGHscripts/inspect_upload_dom.py109 matches.push({CODE
HIGHsrc/notebooklm_tools/core/sharing.py105 # Payload: [[[notebook_id, null, [access_level], [notify, ""]]], 1, null, [2]]COMMENT
HIGHsrc/notebooklm_tools/core/sharing.py142 # Payload: [[[notebook_id, [[email, null, role_code]], null, [notify_flag, message]]], 1, null, [2]]COMMENT
HIGHsrc/notebooklm_tools/core/labels.py16 Raw format: [null, [[name, [[src_id], ...], label_id, emoji], ...]]STRING
HIGHsrc/notebooklm_tools/core/studio.py790 # Options at position 14: [[focus_prompt, language, null, orientation, detail_level, visual_style]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py791 # Captured RPC structure: [[null, "en", null, 1, 2, 2]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py984 # Options at position 7: [null, [title, desc, null, sources, lang, prompt, null, True]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1067 # Config: [2, null, null, [1, null×9, [template_code]], [element types]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1288 # Options at position 9: [null, [1, null, focus_prompt, null*3, [difficulty, card_count]]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1365 # Quiz options at position 9: [null, [2, null, focus_prompt, null*4, [question_count, difficulty]]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1442 # Data Table options at position 18: [null, [description, language]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1544 # Response is nested: [[json_string, null, [gen_ids]]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1545 # So result[0] is [json_string, null, [gen_ids]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1603 # Response is nested: [[mind_map_id, json, metadata, null, title]]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1631 # Tombstone format: [uuid, null, 2]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1643 # Details: [id, json, metadata, null, title]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1897 # Heading blocks start with [null, null, ...]COMMENT
HIGHsrc/notebooklm_tools/core/studio.py1293 None, # Reserved (must be null)CODE
HIGHsrc/notebooklm_tools/core/studio.py1370 None, # Reserved (must be null)CODE
HIGHsrc/notebooklm_tools/core/studio.py140 more lists, or (interactive reports) ``[["uuid"], null, 5]`` whereSTRING
HIGHsrc/notebooklm_tools/core/studio.py1050 - config block: ``[2, null, null, [1, null x9, [<template>]], [<element types>]]``STRING
HIGHsrc/notebooklm_tools/core/studio.py1051 - content block: ``[null, null, 11, <sources>, null x30, [null, [prompt, language]]]``STRING
HIGHsrc/notebooklm_tools/core/studio.py1847 ``[null, null, 0, {"101": "•", "102": 1, "103": <index>, "104": <level>}]``.STRING
HIGHsrc/notebooklm_tools/core/research.py106 # Poll params: [null, null, "notebook_id"]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py100 # Each turn adds: [answer, null, 2] then [query, null, 1]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py478 # For follow-ups: params[2] = [[answer, null, 2], [query, null, 1], ...]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py598 # Each source: [[source_id], title, metadata, [null, 2]]COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py849 # Wrapper containing segments (and possibly metadata like [null, 1])COMMENT
HIGHsrc/notebooklm_tools/core/conversation.py960 # Table segments have segment[2] as null, data in segment[4]COMMENT
HIGH⚡src/notebooklm_tools/core/conversation.py76 Chrome expects history in format: [[answer, null, 2], [query, null, 1], ...]STRING
HIGH⚡src/notebooklm_tools/core/conversation.py699 [["wrb.fr", null, null, null, null, [3]]]STRING
HIGH⚡src/notebooklm_tools/core/conversation.py700 [["wrb.fr", null, null, null, null, [8, null, [["type.googleapis.com/...Error", [...]]]]]]STRING
HIGH⚡src/notebooklm_tools/core/conversation.py750 [["wrb.fr", null, "<nested_json>", ...]]STRING
HIGH⚡src/notebooklm_tools/core/conversation.py753 [["answer_text", null, [conv_id, hash, timestamp], null, [fmt_segments, null, null, source_passages, type_code]]STRING
HIGHsrc/notebooklm_tools/core/conversation.py983 Each passage entry: [["passage_id"], [null, null, confidence, ..., text_passages, [[["SOURCE_ID"], ...]], ...]]STRING
HIGHsrc/notebooklm_tools/core/sources.py233 # Sync params: [null, ["source_id"], [2]]COMMENT
HIGHsrc/notebooklm_tools/core/sources.py341 # Source structure: [[id], title, [metadata...], [null, 2]]COMMENT
HIGHsrc/notebooklm_tools/core/sources.py517 [[[null, "<url>", 627], [null*9, [null, null, 1]], 1]]STRING
HIGHsrc/notebooklm_tools/core/errors.py123 [error_code, null, [[detail_type_url, [sub_codes...]]]]STRING
HIGHsrc/notebooklm_tools/core/notebooks.py53 # [null, 1, null, [2]] - params for list notebooksCOMMENT
HIGHsrc/notebooklm_tools/core/notebooks.py242 # Response format: [title, null, id, emoji, null, metadata, null, [[goal_code, prompt?], [length_code]]]COMMENT
HIGHsrc/notebooklm_tools/core/base.py772 where error_list = [error_code, null, [[detail_type_url, [sub_codes...]]]]STRING
HIGHsrc/notebooklm_tools/mcp/tools/studio.py396 ({heading, text} it sits in, or null) and settings (allowed valuesSTRING
HIGHsrc/notebooklm_tools/services/studio.py663 returned every field null, leaving agents to poll forever).STRING
Excessive Try-Catch Wrapping337 hits · 308 pts
SeverityFileLineSnippetContext
LOWtests/test_file_upload.py406 except Exception:CODE
LOWtests/core/test_auth_migration_protected.py700 except Exception:CODE
LOWtests/core/test_task3_routing_contract.py352 except Exception as e:CODE
LOWtests/core/test_thread_safety.py106 except Exception as e:CODE
LOWtests/core/test_thread_safety.py113 except Exception as e:CODE
MEDIUMtests/core/test_thread_safety.py102def writer():CODE
MEDIUMtests/core/test_thread_safety.py109def clearer():CODE
MEDIUMtests/core/test_task5_mcp_perf_caching.py153def load_task():CODE
LOWtests/core/test_task5_mcp_perf_caching.py157 except Exception as e:CODE
LOWtests/core/test_task5_mcp_perf_caching.py809 except Exception:CODE
LOWtests/services/test_smart_select.py166 except Exception as exc: # pragma: no cover - asserted belowCODE
LOWdocs/MULTI_USER_ANALYSIS.md368 except Exception as e:CODE
LOWdocs/superpowers/plans/2026-09-27-guided-setup.md122 except Exception:CODE
LOWscripts/test_label_rpcs.py140 except Exception as e:CODE
LOWscripts/test_label_rpcs.py163 except Exception as e:CODE
LOWscripts/test_label_rpcs.py174 except Exception as e:CODE
LOWscripts/test_label_rpcs.py188 except Exception as e:CODE
LOWscripts/test_label_rpcs.py200 except Exception as e:CODE
LOWscripts/test_label_rpcs.py210 except Exception as e:CODE
LOWscripts/inject_cookies_and_inspect.py96 except Exception as e:CODE
LOWscripts/inspect_upload_dom.py53 except Exception as e:CODE
LOWscripts/smoke_credential_store.py551 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth.py131 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py618 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py717 except Exception:CODE
LOWsrc/notebooklm_tools/core/auth.py811 except Exception:CODE
LOWsrc/notebooklm_tools/core/auth.py848 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth.py935 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth.py1082 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth.py1151 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth.py1191 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py57 except Exception:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py137 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py266 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py284 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py299 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py314 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py610 except Exception:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py869 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py945 except Exception:CODE
LOWsrc/notebooklm_tools/core/auth_migration.py979 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/studio.py51 except Exception:CODE
LOWsrc/notebooklm_tools/core/studio.py656 except Exception:CODE
LOWsrc/notebooklm_tools/core/studio.py720 except Exception:CODE
LOWsrc/notebooklm_tools/core/research.py376 except Exception:CODE
LOWsrc/notebooklm_tools/core/research.py400 except Exception:CODE
LOWsrc/notebooklm_tools/core/conversation.py224 except Exception:CODE
LOWsrc/notebooklm_tools/core/conversation.py284 except Exception:CODE
LOWsrc/notebooklm_tools/core/conversation.py499 except Exception:CODE
LOWsrc/notebooklm_tools/core/download.py274 except Exception as e:CODE
LOWsrc/notebooklm_tools/core/download.py330 except Exception as e:CODE
LOW⚡src/notebooklm_tools/core/credential_store.py888 except Exception as exc:CODE
LOW⚡src/notebooklm_tools/core/credential_store.py897 except Exception as exc:CODE
LOW⚡src/notebooklm_tools/core/credential_store.py906 except Exception as exc:CODE
LOW⚡src/notebooklm_tools/core/credential_store.py913 except Exception as exc:CODE
LOWsrc/notebooklm_tools/core/credential_store.py128 except Exception:CODE
LOWsrc/notebooklm_tools/core/credential_store.py448 except Exception:CODE
LOWsrc/notebooklm_tools/core/credential_store.py459 except Exception:CODE
LOWsrc/notebooklm_tools/core/credential_store.py470 except Exception:CODE
LOWsrc/notebooklm_tools/core/credential_store.py676 except Exception:CODE
277 more matches not shown…
Structural Annotation Overuse84 hits · 131 pts
SeverityFileLineSnippetContext
LOWREADME.md243### Step 1: Check What You Have InstalledCOMMENT
LOW⚡README.md255### Step 2: Uninstall Legacy PackagesCOMMENT
LOW⚡README.md265### Step 3: Reinstall the Unified PackageCOMMENT
LOW⚡README.md275### Step 4: Verify InstallationCOMMENT
LOWREADME.md289### Step 5: Re-authenticateCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py40 # Step 1: Initial read on nonexistent item must return NoneCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py44 # Step 2: Store secret in macOS KeychainCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py47 # Step 3: Read back secret and verify exact matchCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py51 # Step 4: Verify timeout bounded execution (< 2.0s for 0.5s timeout)COMMENT
LOWtests/test_macos_keychain_smoke.py71 # Step 5: Guaranteed cleanupCOMMENT
LOWdocs/API_REFERENCE.md2035# Step 1: reassign orphaned sources to a different labelCOMMENT
LOWdocs/API_REFERENCE.md2038# Step 2: delete the labelCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md569### Step 1: Authenticate Gemini Notebook AccountCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md576### Step 2: Start MCP ServerCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md588### Step 3: Add Open WebUI FunctionCOMMENT
LOWdocs/MULTI_USER_ANALYSIS.md595### Step 4: Test User IsolationCOMMENT
LOW⚡src/notebooklm_tools/core/sources.py1025 # Step 1: Register source intent → get SOURCE_IDCOMMENT
LOW⚡src/notebooklm_tools/core/sources.py1028 # Step 2: Start resumable upload → get upload URLCOMMENT
LOW⚡src/notebooklm_tools/core/sources.py1031 # Step 3: Stream upload file contentCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md45# Step 1: Authenticate (opens Chrome)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md48# Step 2: Verify authenticationCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md52# Step 3: Create a notebookCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md56# Step 4: Set alias for convenienceCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md59# Step 5: VerifyCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md105# Step 1: Create dedicated notebookCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md109# Step 2: Set aliasCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md112# Step 3: Start deep research (takes ~5 minutes)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md116# Step 4: Monitor progress (polls until complete or timeout)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md119# Step 5: View discovered sourcesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md122# Step 6: Import all discovered sourcesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md127# Step 7: Generate podcastCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md130# Step 8: Check generation status (podcast takes 2-5 minutes)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md134# Step 9: Get podcast URL from studio status outputCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md149# Step 1: Verify sources existCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md152# Step 2: Generate study guide reportCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md156# Step 3: Generate quiz (10 questions, medium difficulty)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md160# Step 4: Generate flashcardsCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md164# Step 5: Generate mind map for visual overviewCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md167# Step 6: Check all generated artifactsCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md201# Step 1: Check current freshness statusCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md205# Step 2: Quick check (skip freshness API calls)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md208# Step 3: Find stale sourcesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md212# Step 4: Sync all stale sourcesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md215# Step 5: Sync specific sources onlyCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md218# Step 6: Verify all freshCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md230# Step 1: Login to work accountCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md233# Step 2: Login to personal accountCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md236# Step 3: List all profilesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md239# Step 4: Switch default profileCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md242# Step 5: Use specific profile for commandsCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md246# Step 6: Create notebook in specific accountCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md257# Step 1: List sourcesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md260# Step 2: Get AI summary of a sourceCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md263# Step 3: Get raw text contentCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md266# Step 4: Export to fileCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md269# Step 5: Export multiple sources (script pattern)COMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md283# Step 1: Create focused notebookCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md287# Step 2: Add relevant sourcesCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md292# Step 3: Generate slide deckCOMMENT
LOW⚡src/notebooklm_tools/data/references/workflows.md296# Step 4: Generate briefing docCOMMENT
24 more matches not shown…
Deep Nesting146 hits · 110 pts
SeverityFileLineSnippetContext
LOWtests/core/test_notebooks.py60CODE
LOWtests/core/test_notebooks.py115CODE
LOWtests/core/test_sources.py44CODE
LOWtests/core/test_sources.py67CODE
LOWsrc/notebooklm_tools/core/auth.py229CODE
LOWsrc/notebooklm_tools/core/auth.py624CODE
LOWsrc/notebooklm_tools/core/exports.py111CODE
LOWsrc/notebooklm_tools/core/sharing.py23CODE
LOWsrc/notebooklm_tools/core/alias.py152CODE
LOWsrc/notebooklm_tools/core/auth_migration.py43CODE
LOWsrc/notebooklm_tools/core/auth_migration.py393CODE
LOWsrc/notebooklm_tools/core/auth_migration.py781CODE
LOWsrc/notebooklm_tools/core/studio.py377CODE
LOWsrc/notebooklm_tools/core/studio.py667CODE
LOWsrc/notebooklm_tools/core/studio.py1619CODE
LOWsrc/notebooklm_tools/core/research.py89CODE
LOWsrc/notebooklm_tools/core/research.py275CODE
LOWsrc/notebooklm_tools/core/conversation.py203CODE
LOWsrc/notebooklm_tools/core/conversation.py245CODE
LOWsrc/notebooklm_tools/core/conversation.py355CODE
LOWsrc/notebooklm_tools/core/conversation.py583CODE
LOWsrc/notebooklm_tools/core/conversation.py695CODE
LOWsrc/notebooklm_tools/core/conversation.py744CODE
LOWsrc/notebooklm_tools/core/conversation.py822CODE
LOWsrc/notebooklm_tools/core/conversation.py885CODE
LOWsrc/notebooklm_tools/core/conversation.py979CODE
LOWsrc/notebooklm_tools/core/download.py138CODE
LOWsrc/notebooklm_tools/core/download.py285CODE
LOWsrc/notebooklm_tools/core/download.py355CODE
LOWsrc/notebooklm_tools/core/download.py459CODE
LOWsrc/notebooklm_tools/core/download.py938CODE
LOWsrc/notebooklm_tools/core/credential_store.py413CODE
LOWsrc/notebooklm_tools/core/credential_store.py753CODE
LOWsrc/notebooklm_tools/core/credential_store.py833CODE
LOWsrc/notebooklm_tools/core/credential_store.py925CODE
LOWsrc/notebooklm_tools/core/credential_store.py1049CODE
LOWsrc/notebooklm_tools/core/notes.py18CODE
LOWsrc/notebooklm_tools/core/notes.py73CODE
LOWsrc/notebooklm_tools/core/notices.py106CODE
LOWsrc/notebooklm_tools/core/sources.py111CODE
LOWsrc/notebooklm_tools/core/sources.py152CODE
LOWsrc/notebooklm_tools/core/sources.py231CODE
LOWsrc/notebooklm_tools/core/sources.py326CODE
LOWsrc/notebooklm_tools/core/sources.py403CODE
LOWsrc/notebooklm_tools/core/sources.py545CODE
LOWsrc/notebooklm_tools/core/sources.py652CODE
LOWsrc/notebooklm_tools/core/sources.py665CODE
LOWsrc/notebooklm_tools/core/sources.py1046CODE
LOWsrc/notebooklm_tools/core/sources.py1068CODE
LOWsrc/notebooklm_tools/core/credential_backend_worker.py311CODE
LOWsrc/notebooklm_tools/core/credential_backend_worker.py150CODE
LOWsrc/notebooklm_tools/core/credential_backend_worker.py157CODE
LOWsrc/notebooklm_tools/core/utils.py64CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py92CODE
LOWsrc/notebooklm_tools/core/notebooks.py37CODE
LOWsrc/notebooklm_tools/core/notebooks.py153CODE
LOWsrc/notebooklm_tools/core/base.py590CODE
LOWsrc/notebooklm_tools/core/base.py720CODE
LOWsrc/notebooklm_tools/core/base.py767CODE
LOWsrc/notebooklm_tools/core/base.py848CODE
86 more matches not shown…
Unused Imports132 hits · 106 pts
SeverityFileLineSnippetContext
LOWtests/test_mcp_cli_parity.py7CODE
LOWtests/test_cdp_port_fallback.py3CODE
LOWtests/test_tool_groups.py95CODE
LOWtests/test_cdp_port_map.py3CODE
LOWtests/test_config_home_dir.py1CODE
LOWtests/test_launcher.py3CODE
LOWtests/core/test_auth_check.py15CODE
LOWtests/core/test_auth_windows_sharing.py3CODE
LOWtests/core/test_cookie_rotation.py1CODE
LOWtests/cli/wizard_driver.py15CODE
LOWtests/services/test_auth_replay_diagnostic.py1CODE
LOWtests/services/test_auth_health.py20CODE
LOWtests/services/test_report_element_generation.py5CODE
LOWscripts/smoke_credential_store.py22CODE
LOWsrc/notebooklm_tools/__init__.py3CODE
LOWsrc/notebooklm_tools/__init__.py7CODE
LOWsrc/notebooklm_tools/core/cookie_rotation.py13CODE
LOWsrc/notebooklm_tools/core/__init__.py3CODE
LOWsrc/notebooklm_tools/core/credential_store.py7CODE
LOWsrc/notebooklm_tools/core/notices.py11CODE
LOWsrc/notebooklm_tools/core/credential_backend_worker.py8CODE
LOWsrc/notebooklm_tools/core/cdp_transport.py9CODE
LOWsrc/notebooklm_tools/utils/firefox.py3CODE
LOWsrc/notebooklm_tools/utils/io_encoding.py10CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/server.py95CODE
LOWsrc/notebooklm_tools/mcp/tool_groups.py23CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py4CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py5CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py5CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py6CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py7CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py7CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py7CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py7CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py13CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py13CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py13CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py13CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py14CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py14CODE
72 more matches not shown…
Self-Referential Comments16 hits · 61 pts
SeverityFileLineSnippetContext
MEDIUM⚡tests/test_mcp_file_upload.py22 # Create a test fileCOMMENT
MEDIUM⚡tests/test_file_upload.py25 # Create a mock client with minimal setupCOMMENT
MEDIUMtests/test_file_upload.py78 # Create a JSON file (unsupported type)COMMENT
MEDIUMtests/test_file_upload.py212 # Create a temporary test fileCOMMENT
MEDIUMtests/test_file_upload.py252 # Create a test fileCOMMENT
MEDIUMtests/test_e2e.py128 # Create a dummy fileCOMMENT
MEDIUM⚡tests/services/test_pipeline.py141 # Create a simple user pipelineCOMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py78 # The following methods are provided by ConversationMixin:COMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py91 # The following methods are provided by NotebookMixin:COMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py103 # The following methods are provided by SharingMixin:COMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py111 # The following methods are provided by SourceMixin:COMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py126 # The following methods are provided by ResearchMixin:COMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py135 # The following methods are provided by StudioMixin:COMMENT
MEDIUM⚡src/notebooklm_tools/core/client.py146 # The following methods are provided by NotesMixin:COMMENT
MEDIUMsrc/notebooklm_tools/utils/wsl.py257 # Create a temp profile directory on the WINDOWS filesystem.COMMENT
MEDIUMsrc/notebooklm_tools/utils/wsl.py281 # Create a unique subdir nameCOMMENT
Synthetic Comment Markers9 hits · 52 pts
SeverityFileLineSnippetContext
HIGHdocs/API_REFERENCE.md69# Get AI-generated summary of what a notebook is aboutCOMMENT
HIGHdocs/API_REFERENCE.md74# Get AI-generated summary of a specific sourceCOMMENT
HIGHdocs/API_REFERENCE.md651 "description", # AI-generated descriptionCODE
HIGHdocs/API_REFERENCE.md656 "summary" # AI-generated summary of sourcesCODE
HIGHdocs/API_REFERENCE.md1077 "The provided documents explore...", # AI-generated summary (markdown formatted)CODE
HIGHdocs/API_REFERENCE.md1113 # AI-generated summary with **bold** markdown for keywordsCOMMENT
HIGHdocs/API_REFERENCE.md1338| **Card Count** | Default count generated by AI |CODE
HIGHdocs/API_REFERENCE.md1468 "Generated Title" # AI-generated titleCODE
HIGHsrc/notebooklm_tools/data/SKILL.md270nlm notebook describe <id> # AI-generated summary + suggested topicsCODE
Fake / Example Data32 hits · 35 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_auth_browser.py253 auth.save_profile(cookies={"SID": "sid", "HSID": "hsid"}, email="user@example.com")CODE
LOWtests/test_mcp_storage_notice.py38 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOWtests/test_mcp_storage_notice.py80 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOW⚡tests/test_mcp_storage_notice.py97 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOW⚡tests/test_mcp_storage_notice.py108 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOW⚡tests/test_mcp_storage_notice.py127 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOWtests/test_cdp_port_map.py161 profile_dir = tmp_path / "John Doe" / "nlm-profile"CODE
LOWtests/core/test_task3_routing_contract.py118 email="user@example.com",CODE
LOW⚡tests/core/test_task4_main_parity.py79 email="user@example.com",CODE
LOWtests/cli/test_storage_cleanup_backups.py76 auth.save_profile(cookies={"SID": "active_sid"}, email="user@example.com")CODE
LOWtests/cli/test_storage_cleanup_backups.py121 auth.save_profile(cookies={"SID": "active_sid"}, email="user@example.com")CODE
LOWtests/cli/test_storage_cleanup_backups.py145 AuthManager("default").save_profile(cookies={"SID": "active_sid"}, email="user@example.com")CODE
LOWtests/cli/test_auth_storage_switch.py54 auth.save_profile(cookies={"SID": "my_sid"}, email="user@example.com")CODE
LOW⚡tests/cli/test_login.py49 return SimpleNamespace(name=self.profile_name, email="user@example.com")CODE
LOW⚡tests/cli/test_login.py63 return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3CODE
LOWtests/cli/test_login.py90 return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3CODE
LOWtests/cli/test_login.py103 "email": "user@example.com",CODE
LOWtests/cli/test_login.py122 "email": "user@example.com",CODE
LOWtests/cli/test_login.py143 return SimpleNamespace(name=auth.profile_name, email="user@example.com"), 3CODE
LOWtests/cli/test_login.py151 "email": "user@example.com",CODE
LOWtests/cli/test_login.py183 email="user@example.com",CODE
LOWtests/cli/test_login_storage_choice.py271 "email": "user@example.com",CODE
LOWtests/cli/test_profile_storage.py39 email="user@example.com",CODE
LOWtests/cli/test_profile_storage.py61 assert loaded.email == "user@example.com"CODE
LOWtests/cli/test_protect_shared_answer.py38 auth.save_profile(cookies={"SID": "sid"}, email="user@example.com")CODE
LOWtests/cli/test_protect_shared_answer.py69 auth.save_profile(cookies={"SID": "sid"}, email="user@example.com")CODE
LOWtests/cli/test_protect_shared_answer.py97 auth.save_profile(cookies={"SID": "sid"}, email="user@example.com")CODE
LOWtests/cli/test_protect_shared_answer.py125 auth.save_profile(cookies={"SID": "sid"}, email="user@example.com")CODE
LOWtests/cli/test_storage_notice.py28 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOWtests/cli/test_storage_notice.py56 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOWtests/cli/test_storage_notice.py84 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
LOWtests/cli/test_storage_notice.py100 auth.save_profile(cookies={"SID": "test_sid"}, email="user@example.com")CODE
Modern Structural Boilerplate36 hits · 34 pts
SeverityFileLineSnippetContext
LOWtests/core/test_credential_backend_worker.py45 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWtests/core/test_auth_migration_protected.py710 def set_password(self, s: str, a: str, pw: str) -> None:CODE
LOW⚡tests/cli/test_setup_wizard_e2e.py74def _set_skill_version(path, version: str) -> None:CODE
LOWscripts/smoke_credential_store.py389 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/__init__.py11__all__ = ["NotebookLMClient", "__version__"]CODE
LOWsrc/notebooklm_tools/core/auth.py22logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/alias.py96 def set_alias(self, name: str, value: str, alias_type: str = "unknown") -> None:CODE
LOW⚡src/notebooklm_tools/core/auth_migration.py40logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/cookie_rotation.py25logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/__init__.py5__all__ = ["load_cached_tokens", "save_tokens_to_cache", "constants"]CODE
LOWsrc/notebooklm_tools/core/credential_store.py305 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/core/credential_store.py322 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/core/credential_store.py343 def set_password(self, service: str, username: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/core/credential_store.py363 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/core/credential_store.py388 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/core/credential_store.py402def set_backend_factory(factory: Callable[[], CredentialBackend] | None) -> None:CODE
LOWsrc/notebooklm_tools/core/credential_backend_worker.py98 def set_password(self, service: str, account: str, password: str) -> None:CODE
LOWsrc/notebooklm_tools/core/collections.py8logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/notebooks.py21logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/usage.py13logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/core/base.py1349 def _update_cached_tokens(self) -> None:CODE
LOWsrc/notebooklm_tools/utils/config.py656def set_auth_storage_mode(profile_name: str, mode: str) -> None:CODE
LOWsrc/notebooklm_tools/utils/config.py811def set_session_profile(name: str | None) -> None:CODE
LOWsrc/notebooklm_tools/utils/wsl.py39logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/utils/cdp.py85__all__ = [CODE
LOWsrc/notebooklm_tools/mcp/tools/__init__.py69__all__ = [CODE
LOWsrc/notebooklm_tools/mcp/tools/_utils.py270def set_query_timeout(timeout: float) -> None:CODE
LOWsrc/notebooklm_tools/cli/commands/setup.py1509def _setup_all() -> None:CODE
LOWsrc/notebooklm_tools/cli/commands/setup.py1683def _setup_json() -> None:CODE
LOWsrc/notebooklm_tools/services/auth.py38logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/auth.py40__all__ = [CODE
LOWsrc/notebooklm_tools/services/studio.py27logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/__init__.py15__all__ = [CODE
LOWsrc/notebooklm_tools/services/chat.py18logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/chats.py22logger = logging.getLogger(__name__)CODE
LOWsrc/notebooklm_tools/services/_compat.py10__all__ = ["TypedDict"]CODE
Redundant / Tautological Comments24 hits · 31 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_mcp_file_upload.py15 # Check if source_add exists and supports file typeCOMMENT
LOWtests/core/test_task3_routing_contract.py447 # Set storage to file (no-op update) worksCOMMENT
LOWsrc/notebooklm_tools/core/studio.py527 # Check if it looks like a timestamp [seconds, nanos]COMMENT
LOWsrc/notebooklm_tools/core/research.py239 # Check if this is deep research format (src[0] is None, src[1] is title)COMMENT
LOWsrc/notebooklm_tools/core/conversation.py444 # Check if we have cached history for this conversationCOMMENT
LOWsrc/notebooklm_tools/core/credential_store.py874 # Check if a deletion operation was in progress (distinguish deletion intent from corruption)COMMENT
LOWsrc/notebooklm_tools/core/sources.py450 # Check if v1 actually accepted it (accepted-pending)COMMENT
LOWsrc/notebooklm_tools/core/notebooks.py93 # Check if shared (for owned notebooks)COMMENT
LOWsrc/notebooklm_tools/core/base.py1291 # Check if redirected to login (cookies expired)COMMENT
LOWsrc/notebooklm_tools/core/base.py256 RPC_CHECK_FRESHNESS = "yR9Yof" # Check if Drive source is staleCODE
LOWsrc/notebooklm_tools/utils/config.py475 # Check if new location already has dataCOMMENT
LOWsrc/notebooklm_tools/utils/wsl.py202 # Check if Chrome is already running - this is a HARD REQUIREMENTCOMMENT
LOWsrc/notebooklm_tools/utils/wsl.py476 # Check if rule existsCOMMENT
LOWsrc/notebooklm_tools/utils/wsl.py545 # Check if it's a permission issueCOMMENT
LOW⚡src/notebooklm_tools/utils/cdp.py1486 # Check if process is alive but CDP is unresponsiveCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py588 # Check if it's a symlink pointing to a snap path. Normalize the resolvedCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py1570 # Check if Chrome is running with debuggingCOMMENT
LOWsrc/notebooklm_tools/utils/cdp.py1973 # Check if profile exists with saved loginCOMMENT
LOWsrc/notebooklm_tools/cli/utils.py157 # Check if cache is still valid (24 hours = 86400 seconds)COMMENT
LOWsrc/notebooklm_tools/cli/main.py1025 # Check if profile existsCOMMENT
LOWsrc/notebooklm_tools/cli/commands/skill.py327 # Check if export directory existsCOMMENT
LOWsrc/notebooklm_tools/cli/commands/skill.py522 # Check if already installedCOMMENT
LOWsrc/notebooklm_tools/cli/commands/skill.py717 # Check if already installedSTRING
LOWsrc/notebooklm_tools/cli/commands/setup.py1526 # Display results tableCOMMENT
Cross-File Repetition6 hits · 30 pts
SeverityFileLineSnippetContext
HIGHtests/core/test_auth_migration_protected.py0isolate storage dir and reset config for each test.STRING
HIGHtests/core/test_task4_main_parity.py0isolate storage dir and reset config for each test.STRING
HIGHtests/cli/test_auth_storage_switch.py0isolate storage dir and reset config for each test.STRING
HIGHsrc/notebooklm_tools/core/sharing.py0mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatioSTRING
HIGHsrc/notebooklm_tools/core/sources.py0mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatioSTRING
HIGHsrc/notebooklm_tools/core/notebooks.py0mixin for notebook management operations. this class inherits from baseclient and provides all notebook-related operatioSTRING
AI Structural Patterns36 hits · 28 pts
SeverityFileLineSnippetContext
LOWsrc/notebooklm_tools/core/auth.py414CODE
LOWsrc/notebooklm_tools/core/auth.py624CODE
LOWsrc/notebooklm_tools/core/base.py445CODE
LOWsrc/notebooklm_tools/mcp/tools/studio.py67CODE
LOWsrc/notebooklm_tools/mcp/tools/batch.py9CODE
LOWsrc/notebooklm_tools/mcp/tools/sources.py16CODE
LOWsrc/notebooklm_tools/cli/main.py428CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py149CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py256CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py312CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py495CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py636CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py782CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py891CODE
LOWsrc/notebooklm_tools/cli/commands/studio.py938CODE
LOWsrc/notebooklm_tools/cli/commands/research.py21CODE
LOWsrc/notebooklm_tools/cli/commands/download.py236CODE
LOWsrc/notebooklm_tools/cli/commands/notebook.py149CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py113CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py147CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py186CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py226CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py264CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py294CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py413CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py647CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py799CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py898CODE
LOWsrc/notebooklm_tools/cli/commands/verbs.py1001CODE
LOWsrc/notebooklm_tools/cli/commands/source.py21CODE
LOWsrc/notebooklm_tools/cli/commands/source.py60CODE
LOWsrc/notebooklm_tools/services/studio.py302CODE
LOWsrc/notebooklm_tools/services/downloads.py450CODE
LOWsrc/notebooklm_tools/services/downloads.py567CODE
LOWsrc/notebooklm_tools/services/downloads.py769CODE
LOWsrc/notebooklm_tools/services/sources.py135CODE
Verbosity Indicators8 hits · 17 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_macos_keychain_smoke.py40 # Step 1: Initial read on nonexistent item must return NoneCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py44 # Step 2: Store secret in macOS KeychainCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py47 # Step 3: Read back secret and verify exact matchCOMMENT
LOW⚡tests/test_macos_keychain_smoke.py51 # Step 4: Verify timeout bounded execution (< 2.0s for 0.5s timeout)COMMENT
LOWtests/test_macos_keychain_smoke.py71 # Step 5: Guaranteed cleanupCOMMENT
LOW⚡src/notebooklm_tools/core/sources.py1025 # Step 1: Register source intent → get SOURCE_IDCOMMENT
LOW⚡src/notebooklm_tools/core/sources.py1028 # Step 2: Start resumable upload → get upload URLCOMMENT
LOW⚡src/notebooklm_tools/core/sources.py1031 # Step 3: Stream upload file contentCOMMENT
Modern AI Meta-Vocabulary2 hits · 8 pts
SeverityFileLineSnippetContext
MEDIUMsrc/notebooklm_tools/core/auth.py1219# orchestration, caching, verdict aggregation) and belong in the servicesCOMMENT
MEDIUM⚡src/notebooklm_tools/services/auth.py328 # Probe orchestrationCOMMENT
AI Slop Vocabulary2 hits · 5 pts
SeverityFileLineSnippetContext
LOW⚡tests/cli/test_setup_wizard.py420 # Mocked questions have no .application; the helper must still just call ask().COMMENT
MEDIUMsrc/notebooklm_tools/cli/ai_docs.py314# their chat history natively into the NotebookLM web UI, enabling seamless cross-device sessions.COMMENT
Over-Commented Block7 hits · 5 pts
SeverityFileLineSnippetContext
LOWtests/test_api_client.py21COMMENT
LOWsrc/notebooklm_tools/core/auth.py361#COMMENT
LOWsrc/notebooklm_tools/core/client.py81 # - get_conversation_historyCOMMENT
LOWsrc/notebooklm_tools/core/client.py101 # Sharing Operations (inherited from SharingMixin)COMMENT
LOWsrc/notebooklm_tools/core/client.py121 # - get_source_fulltextCOMMENT
LOWsrc/notebooklm_tools/mcp/tools/studio.py201 # Pre-flight auth gate: fail loudly NOW rather than returning a fakeCOMMENT
LOWsrc/notebooklm_tools/data/SKILL.md501# Each --slide value must be: '<slide-number> <instruction>'COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOW⚡src/notebooklm_tools/core/auth.py365# Usage:COMMENT