{"data":{"skill":{"slug":"zhanlincui-notebooklm","name":"notebooklm","icon":"📦","repo":"https://github.com/ZhanlinCui/Ultimate-Agent-Skills-Collection/tree/main/notebooklm","status":"approved","author":"ZhanlinCui","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"6403812b-541e-4752-aff3-f83dc1de3313","skill_id":"bf3bc32d-a9fa-4d5a-b31a-fc070720c6fd","version":4,"content_hash":"v2:64ca8af0f54a325752f08bd54e52151061ea659a:99d863974fea5e63b7557a3efe007c2dd4197961b3397cd2af35d953b94eb829:80047213beb6b4c4455a74d514c729c40f1482340ebc4df0a72f066133c96777:4078055594e4a1afc29c484ed015c424","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"Executable scripts use subprocess to set up an environment, install dependencies, install browser binaries, and run local scripts. Many Markdown detections are false positives, but the real code still stores session state and automates Google NotebookLM. Before publication, add explicit consent, URL validation, credential storage protections, and command allowlisting.","remediation":[{"issue":"Automatic subprocess setup and runtime script execution","severity":"high","suggestion":"Ask before dependency or browser installation. Remove import-time setup and allowlist script names in run.py."},{"issue":"Persistent Google browser session data on disk","severity":"high","suggestion":"Use OS keychain or encrypted storage. Restrict file permissions and add clear cleanup controls."},{"issue":"Notebook URLs are opened before strict domain validation","severity":"high","suggestion":"Validate URLs before page.goto. Allow only https://notebooklm.google.com/notebook/ unless the user approves another target."},{"issue":"Stealth and anti-detection browser automation","severity":"high","suggestion":"Remove anti-detection behavior where possible. Disclose browser automation and avoid bypassing service automation checks."},{"issue":"NotebookLM responses can influence agent follow-up behavior","severity":"medium","suggestion":"Treat NotebookLM answers as untrusted source content. Ensure tool output cannot override higher-priority instructions."},{"issue":"Cleanup commands can delete local state","severity":"medium","suggestion":"Keep cleanup behind confirmation. Show exact paths before deletion and avoid force mode by default."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"references/api_reference.md","line_end":160,"line_start":160},{"file":"references/api_reference.md","line_end":216,"line_start":216},{"file":"references/api_reference.md","line_end":228,"line_start":228},{"file":"references/api_reference.md","line_end":249,"line_start":249},{"file":"references/api_reference.md","line_end":271,"line_start":271},{"file":"references/troubleshooting.md","line_end":132,"line_start":132},{"file":"references/troubleshooting.md","line_end":277,"line_start":277},{"file":"references/usage_patterns.md","line_end":177,"line_start":177},{"file":"references/usage_patterns.md","line_end":210,"line_start":210},{"file":"references/usage_patterns.md","line_end":219,"line_start":219},{"file":"references/usage_patterns.md","line_end":143,"line_start":143},{"file":"scripts/__init__.py","line_end":53,"line_start":53},{"file":"scripts/__init__.py","line_end":65,"line_start":65},{"file":"scripts/run.py","line_end":38,"line_start":38},{"file":"scripts/run.py","line_end":91,"line_start":91},{"file":"scripts/setup_environment.py","line_end":54,"line_start":54},{"file":"scripts/setup_environment.py","line_end":62,"line_start":62},{"file":"scripts/setup_environment.py","line_end":75,"line_start":75},{"file":"scripts/setup_environment.py","line_end":132,"line_start":132},{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":30,"line_start":24},{"file":"SKILL.md","line_end":33,"line_start":30},{"file":"SKILL.md","line_end":34,"line_start":33},{"file":"SKILL.md","line_end":35,"line_start":34},{"file":"SKILL.md","line_end":36,"line_start":35},{"file":"SKILL.md","line_end":42,"line_start":36},{"file":"SKILL.md","line_end":44,"line_start":42},{"file":"SKILL.md","line_end":52,"line_start":44},{"file":"SKILL.md","line_end":54,"line_start":52},{"file":"SKILL.md","line_end":55,"line_start":54},{"file":"SKILL.md","line_end":63,"line_start":55},{"file":"SKILL.md","line_end":65,"line_start":63},{"file":"SKILL.md","line_end":70,"line_start":65},{"file":"SKILL.md","line_end":73,"line_start":70},{"file":"SKILL.md","line_end":83,"line_start":73},{"file":"SKILL.md","line_end":106,"line_start":83},{"file":"SKILL.md","line_end":109,"line_start":106},{"file":"SKILL.md","line_end":110,"line_start":109},{"file":"SKILL.md","line_end":114,"line_start":110},{"file":"SKILL.md","line_end":126,"line_start":114},{"file":"SKILL.md","line_end":137,"line_start":126},{"file":"SKILL.md","line_end":139,"line_start":137},{"file":"SKILL.md","line_end":145,"line_start":139},{"file":"SKILL.md","line_end":146,"line_start":145},{"file":"SKILL.md","line_end":151,"line_start":146},{"file":"SKILL.md","line_end":153,"line_start":151},{"file":"SKILL.md","line_end":154,"line_start":153},{"file":"SKILL.md","line_end":161,"line_start":154},{"file":"SKILL.md","line_end":163,"line_start":161},{"file":"SKILL.md","line_end":164,"line_start":163},{"file":"SKILL.md","line_end":166,"line_start":164},{"file":"SKILL.md","line_end":168,"line_start":166},{"file":"SKILL.md","line_end":169,"line_start":168},{"file":"SKILL.md","line_end":173,"line_start":169},{"file":"SKILL.md","line_end":178,"line_start":173},{"file":"SKILL.md","line_end":184,"line_start":178},{"file":"SKILL.md","line_end":189,"line_start":184},{"file":"SKILL.md","line_end":193,"line_start":189},{"file":"SKILL.md","line_end":194,"line_start":193},{"file":"SKILL.md","line_end":195,"line_start":194},{"file":"SKILL.md","line_end":196,"line_start":195},{"file":"SKILL.md","line_end":198,"line_start":196},{"file":"SKILL.md","line_end":202,"line_start":198},{"file":"SKILL.md","line_end":203,"line_start":202},{"file":"SKILL.md","line_end":210,"line_start":203},{"file":"SKILL.md","line_end":214,"line_start":210},{"file":"SKILL.md","line_end":230,"line_start":214},{"file":"SKILL.md","line_end":236,"line_start":230},{"file":"SKILL.md","line_end":239,"line_start":236},{"file":"SKILL.md","line_end":240,"line_start":239},{"file":"SKILL.md","line_end":262,"line_start":240},{"file":"SKILL.md","line_end":263,"line_start":262},{"file":"SKILL.md","line_end":264,"line_start":263},{"file":"SKILL.md","line_end":265,"line_start":264},{"file":"SKILL.md","line_end":266,"line_start":265},{"file":"SKILL.md","line_end":267,"line_start":266},{"file":"SKILL.md","line_end":268,"line_start":267},{"file":"SKILL.md","line_end":269,"line_start":268}]},{"factor":"network","evidence":[{"file":"references/api_reference.md","line_end":30,"line_start":30},{"file":"references/api_reference.md","line_end":52,"line_start":52},{"file":"references/api_reference.md","line_end":59,"line_start":59},{"file":"references/troubleshooting.md","line_end":148,"line_start":148},{"file":"references/troubleshooting.md","line_end":209,"line_start":209},{"file":"references/troubleshooting.md","line_end":210,"line_start":210},{"file":"references/troubleshooting.md","line_end":209,"line_start":209},{"file":"references/troubleshooting.md","line_end":210,"line_start":210},{"file":"references/usage_patterns.md","line_end":31,"line_start":31},{"file":"scripts/ask_question.py","line_end":9,"line_start":9},{"file":"scripts/ask_question.py","line_end":80,"line_start":80},{"file":"scripts/auth_manager.py","line_end":10,"line_start":10},{"file":"scripts/auth_manager.py","line_end":114,"line_start":114},{"file":"scripts/auth_manager.py","line_end":129,"line_start":129},{"file":"scripts/auth_manager.py","line_end":260,"line_start":260},{"file":"scripts/setup_environment.py","line_end":72,"line_start":72},{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":93,"line_start":93},{"file":"SKILL.md","line_end":122,"line_start":122}]},{"factor":"filesystem","evidence":[{"file":"references/api_reference.md","line_end":185,"line_start":185},{"file":"references/api_reference.md","line_end":185,"line_start":185},{"file":"references/troubleshooting.md","line_end":101,"line_start":101},{"file":"references/troubleshooting.md","line_end":223,"line_start":223},{"file":"references/troubleshooting.md","line_end":226,"line_start":226},{"file":"references/troubleshooting.md","line_end":236,"line_start":236},{"file":"references/troubleshooting.md","line_end":282,"line_start":282},{"file":"references/troubleshooting.md","line_end":283,"line_start":283},{"file":"references/troubleshooting.md","line_end":287,"line_start":287},{"file":"references/troubleshooting.md","line_end":298,"line_start":298},{"file":"references/troubleshooting.md","line_end":299,"line_start":299},{"file":"references/troubleshooting.md","line_end":306,"line_start":306},{"file":"references/troubleshooting.md","line_end":353,"line_start":353},{"file":"references/troubleshooting.md","line_end":361,"line_start":361},{"file":"references/troubleshooting.md","line_end":101,"line_start":101},{"file":"references/troubleshooting.md","line_end":223,"line_start":223},{"file":"references/troubleshooting.md","line_end":226,"line_start":226},{"file":"references/troubleshooting.md","line_end":236,"line_start":236},{"file":"references/troubleshooting.md","line_end":282,"line_start":282},{"file":"references/troubleshooting.md","line_end":283,"line_start":283},{"file":"references/troubleshooting.md","line_end":287,"line_start":287},{"file":"references/troubleshooting.md","line_end":298,"line_start":298},{"file":"references/troubleshooting.md","line_end":299,"line_start":299},{"file":"references/troubleshooting.md","line_end":306,"line_start":306},{"file":"references/troubleshooting.md","line_end":353,"line_start":353},{"file":"references/troubleshooting.md","line_end":361,"line_start":361},{"file":"scripts/auth_manager.py","line_end":177,"line_start":177},{"file":"scripts/auth_manager.py","line_end":204,"line_start":204},{"file":"scripts/cleanup_manager.py","line_end":173,"line_start":173},{"file":"scripts/notebook_manager.py","line_end":58,"line_start":58},{"file":"SKILL.md","line_end":193,"line_start":193},{"file":"SKILL.md","line_end":193,"line_start":193}]},{"factor":"env_access","evidence":[{"file":"requirements.txt","line_end":10,"line_start":10}]}],"critical_findings":[],"high_findings":[{"title":"Python subprocess.run","locations":[{"file":"scripts/__init__.py","line_end":53,"line_start":53}],"confidence":0.93,"description":"subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"On import, the package runs pip install against requirements.txt in the skill venv. Automatic dependency installation executes external package code and is a real supply-chain risk."},{"title":"Python subprocess.run","locations":[{"file":"scripts/__init__.py","line_end":65,"line_start":65}],"confidence":0.91,"description":"subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"On import, the package runs patchright browser installation through subprocess. This downloads and executes external setup commands as a side effect."},{"title":"Python subprocess.run","locations":[{"file":"scripts/run.py","line_end":38,"line_start":38}],"confidence":0.9,"description":"result = subprocess.run([sys.executable, str(setup_script)])","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"run.py automatically invokes setup_environment.py when the venv is missing. That bootstrap path can install dependencies and browser binaries before the requested task runs."},{"title":"Python subprocess.run","locations":[{"file":"scripts/run.py","line_end":91,"line_start":91}],"confidence":0.86,"description":"result = subprocess.run(cmd)","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"run.py executes a command built from the requested script name and arguments. It is scoped to the scripts directory, but there is no explicit allowlist before subprocess execution."},{"title":"Python subprocess.run","locations":[{"file":"scripts/setup_environment.py","line_end":54,"line_start":54}],"confidence":0.92,"description":"subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"The setup code upgrades pip through subprocess. This is intended setup behavior, but it executes package-management commands from skill code."},{"title":"Python subprocess.run","locations":[{"file":"scripts/setup_environment.py","line_end":62,"line_start":62}],"confidence":0.95,"description":"result = subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"The setup code installs requirements.txt through pip. Installing dependencies at runtime is a real external code execution and supply-chain risk."},{"title":"Python subprocess.run","locations":[{"file":"scripts/setup_environment.py","line_end":75,"line_start":75}],"confidence":0.94,"description":"subprocess.run(","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"The setup code runs patchright install chrome through subprocess. This downloads browser binaries and extends the local execution surface."},{"title":"Python subprocess.run","locations":[{"file":"scripts/setup_environment.py","line_end":132,"line_start":132}],"confidence":0.84,"description":"result = subprocess.run(cmd)","review_kind":"capability","source_category":"external_commands","source_severity":"high","confidence_reasoning":"setup_environment.py can run a requested script through the venv Python. This is local command execution selected at runtime."},{"title":"Persistent Google Session Storage","locations":[{"file":"scripts/auth_manager.py","line_end":165,"line_start":160},{"file":"SKILL.md","line_end":198,"line_start":193}],"confidence":0.93,"description":"The skill saves browser storage state for NotebookLM authentication and documents browser cookies and session data in local skill storage. This keeps Google session material on disk and increases exposure if local files are read.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"auth_manager.py directly saves browser storage state to disk, and SKILL.md identifies browser cookies and session storage. This is clear persistent credential-adjacent material."},{"title":"Unvalidated Notebook URL Opened With Authenticated Browser","locations":[{"file":"scripts/ask_question.py","line_end":47,"line_start":40},{"file":"scripts/ask_question.py","line_end":80,"line_start":75},{"file":"scripts/notebook_manager.py","line_end":99,"line_start":63}],"confidence":0.86,"description":"The question interface accepts a notebook URL and opens it in the browser before the NotebookLM domain wait succeeds. A malicious or mistaken URL can load in an authenticated browser profile before validation fails.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The URL is supplied by arguments or library metadata and page.goto runs before domain enforcement. The risk is bounded by browser origin controls but still exposes the authenticated browser session to arbitrary navigation."},{"title":"Stealth Browser Automation Against Google NotebookLM","locations":[{"file":"scripts/setup_environment.py","line_end":76,"line_start":70},{"file":"SKILL.md","line_end":207,"line_start":202},{"file":"scripts/ask_question.py","line_end":115,"line_start":103}],"confidence":0.9,"description":"The skill installs a browser for Patchright anti-detection use, configures stealth-related settings, and simulates human typing. This increases abuse and account-policy risk for an external Google service.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The comments and configuration explicitly reference anti-detection and stealth behavior, and ask_question.py uses human-like typing and delay logic. The intent is clear even though it supports the stated feature."}],"medium_findings":[{"title":"Python file write/append","locations":[{"file":"scripts/auth_manager.py","line_end":177,"line_start":177}],"confidence":0.78,"description":"with open(self.auth_info_file, 'w') as f:","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The skill writes authentication metadata to a local auth_info file. The path is scoped, but it persists account-related state on disk."},{"title":"Python shutil operations","locations":[{"file":"scripts/auth_manager.py","line_end":204,"line_start":204}],"confidence":0.8,"description":"shutil.rmtree(self.browser_state_dir)","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"clear_auth removes the browser state directory with shutil.rmtree. The path is scoped to skill data, but it is a destructive operation over stored session material."},{"title":"Python shutil operations","locations":[{"file":"scripts/cleanup_manager.py","line_end":173,"line_start":173}],"confidence":0.78,"description":"shutil.rmtree(path)","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The cleanup command deletes discovered data paths with shutil.rmtree. It is scoped and usually confirmed, but it can remove browser state, sessions, and library data."},{"title":"Python file write/append","locations":[{"file":"scripts/notebook_manager.py","line_end":58,"line_start":58}],"confidence":0.76,"description":"with open(self.library_file, 'w') as f:","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The library manager writes notebook URLs and metadata to disk. The file is scoped, but it persists user research context and access URLs locally."},{"title":"Tool Output Can Steer Agent Follow-Up Behavior","locations":[{"file":"scripts/ask_question.py","line_end":37,"line_start":29},{"file":"scripts/ask_question.py","line_end":167,"line_start":165},{"file":"SKILL.md","line_end":141,"line_start":128}],"confidence":0.82,"description":"The skill appends a strong follow-up instruction to NotebookLM answers and tells the agent to stop, analyze, and ask more questions before responding. NotebookLM answers originate from uploaded documents, so source content can influence agent control flow unless treated as untrusted.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The follow-up instruction is explicit in both code and skill instructions. I did not find a malicious prompt injection string, but the design creates a reliable path for untrusted source text to affect agent behavior."}],"low_findings":[{"title":"Hardcoded URL","locations":[{"file":"scripts/ask_question.py","line_end":80,"line_start":80}],"confidence":0.88,"description":"page.wait_for_url(re.compile(r\"^https://notebooklm\\.google\\.com/\"), timeout=10000)","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The code validates that navigation reaches notebooklm.google.com during a query. This is intended, but it confirms external Google network access for user questions and notebooks."},{"title":"Hardcoded URL","locations":[{"file":"scripts/auth_manager.py","line_end":114,"line_start":114}],"confidence":0.9,"description":"page.goto(\"https://notebooklm.google.com\", wait_until=\"domcontentloaded\")","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The authentication flow opens notebooklm.google.com in a persistent browser context. This is intended, but it sends browser traffic to an external Google service."},{"title":"Hardcoded URL","locations":[{"file":"scripts/auth_manager.py","line_end":129,"line_start":129}],"confidence":0.84,"description":"page.wait_for_url(re.compile(r\"^https://notebooklm\\.google\\.com/\"), timeout=timeout_ms)","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The login flow waits for a NotebookLM URL after Google authentication. This confirms external network use tied to a user account."},{"title":"Hardcoded URL","locations":[{"file":"scripts/auth_manager.py","line_end":260,"line_start":260}],"confidence":0.9,"description":"page.goto(\"https://notebooklm.google.com\", wait_until=\"domcontentloaded\", timeout=30000)","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The validation flow opens notebooklm.google.com to check stored authentication. This is intended, but it uses external network access with saved browser state."}],"dangerous_patterns":[],"files_scanned":15,"total_lines":3425,"audit_model":"codex","audited_at":"2026-07-08T13:32:43.802+00:00","created_at":"2026-07-08T14:54:48.32527+00:00","static_findings":[{"id":"external_commands:references/api_reference.md:160:python-subprocess-run","file":"references/api_reference.md","pattern":"Python subprocess.run","snippet":"result = subprocess.run([","category":"external_commands","line_end":160,"severity":"high","line_start":160},{"id":"external_commands:references/api_reference.md:216:python-subprocess-run","file":"references/api_reference.md","pattern":"Python subprocess.run","snippet":"result = subprocess.run([","category":"external_commands","line_end":216,"severity":"high","line_start":216},{"id":"external_commands:references/api_reference.md:228:python-subprocess-run","file":"references/api_reference.md","pattern":"Python subprocess.run","snippet":"subprocess.run([\"python\", \"scripts/run.py\", \"auth_manager.py\", \"setup\"])","category":"external_commands","line_end":228,"severity":"high","line_start":228},{"id":"external_commands:references/api_reference.md:249:python-subprocess-run","file":"references/api_reference.md","pattern":"Python subprocess.run","snippet":"result = subprocess.run([","category":"external_commands","line_end":249,"severity":"high","line_start":249},{"id":"external_commands:references/api_reference.md:271:python-subprocess-run","file":"references/api_reference.md","pattern":"Python subprocess.run","snippet":"result = subprocess.run([","category":"external_commands","line_end":271,"severity":"high","line_start":271},{"id":"network:references/api_reference.md:30:hardcoded-url","file":"references/api_reference.md","pattern":"Hardcoded URL","snippet":"python scripts/run.py ask_question.py --question \"...\" --notebook-url \"https://...\"","category":"network","line_end":30,"severity":"low","line_start":30},{"id":"network:references/api_reference.md:52:hardcoded-url","file":"references/api_reference.md","pattern":"Hardcoded URL","snippet":"--url \"https://notebooklm.google.com/notebook/...\" \\","category":"network","line_end":52,"severity":"low","line_start":52},{"id":"network:references/api_reference.md:59:hardcoded-url","file":"references/api_reference.md","pattern":"Hardcoded URL","snippet":"--url \"https://notebooklm.google.com/notebook/...\" \\","category":"network","line_end":59,"severity":"low","line_start":59},{"id":"filesystem:references/api_reference.md:185:hidden-file-in-home-directory","file":"references/api_reference.md","pattern":"Hidden file in home directory","snippet":"Location: `~/.claude/skills/notebooklm/data/`","category":"filesystem","line_end":185,"severity":"high","line_start":185},{"id":"filesystem:references/api_reference.md:185:hidden-file-access","file":"references/api_reference.md","pattern":"Hidden file access","snippet":"Location: `~/.claude/skills/notebooklm/data/`","category":"filesystem","line_end":185,"severity":"medium","line_start":185},{"id":"sensitive:references/api_reference.md:199:environment-file-access","file":"references/api_reference.md","pattern":"Environment file access","snippet":"Optional `.env` file configuration:","category":"sensitive","line_end":199,"severity":"high","line_start":199},{"id":"blocker:references/api_reference.md:27:system-reconnaissance","file":"references/api_reference.md","pattern":"System reconnaissance","snippet":"python scripts/run.py ask_question.py --question \"...\" --notebook-id notebook-id","category":"blocker","line_end":27,"severity":"low","line_start":27},{"id":"blocker:references/api_reference.md:71:system-reconnaissance","file":"references/api_reference.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py activate --id notebook-id","category":"blocker","line_end":71,"severity":"low","line_start":71},{"id":"blocker:references/api_reference.md:74:system-reconnaissance","file":"references/api_reference.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py remove --id notebook-id","category":"blocker","line_end":74,"severity":"low","line_start":74},{"id":"blocker:references/api_reference.md:252:system-reconnaissance","file":"references/api_reference.md","pattern":"System reconnaissance","snippet":"\"--notebook-id\", notebook_id","category":"blocker","line_end":253,"severity":"low","line_start":252},{"id":"blocker:references/api_reference.md:274:system-reconnaissance","file":"references/api_reference.md","pattern":"System reconnaissance","snippet":"\"--notebook-id\", notebook_id","category":"blocker","line_end":275,"severity":"low","line_start":274},{"id":"blocker:references/api_reference.md:277:system-reconnaissance","file":"references/api_reference.md","pattern":"System reconnaissance","snippet":"time.sleep(2)  # Avoid rate limits","category":"blocker","line_end":277,"severity":"low","line_start":277},{"id":"external_commands:references/troubleshooting.md:132:python-subprocess-run","file":"references/troubleshooting.md","pattern":"Python subprocess.run","snippet":"subprocess.run([\"python\", \"scripts/run.py\", \"auth_manager.py\", \"reauth\"])","category":"external_commands","line_end":132,"severity":"high","line_start":132},{"id":"external_commands:references/troubleshooting.md:277:unix-shell-invocation","file":"references/troubleshooting.md","pattern":"Unix shell invocation","snippet":"#!/bin/bash","category":"external_commands","line_end":277,"severity":"medium","line_start":277},{"id":"network:references/troubleshooting.md:148:hardcoded-url","file":"references/troubleshooting.md","pattern":"Hardcoded URL","snippet":"--url \"https://notebooklm.google.com/...\" \\","category":"network","line_end":148,"severity":"low","line_start":148},{"id":"network:references/troubleshooting.md:209:hardcoded-url","file":"references/troubleshooting.md","pattern":"Hardcoded URL","snippet":"export HTTP_PROXY=http://proxy:port","category":"network","line_end":209,"severity":"low","line_start":209},{"id":"network:references/troubleshooting.md:210:hardcoded-url","file":"references/troubleshooting.md","pattern":"Hardcoded URL","snippet":"export HTTPS_PROXY=http://proxy:port","category":"network","line_end":210,"severity":"low","line_start":210},{"id":"network:references/troubleshooting.md:209:proxy-environment-variable","file":"references/troubleshooting.md","pattern":"Proxy environment variable","snippet":"export HTTP_PROXY=http://proxy:port","category":"network","line_end":209,"severity":"medium","line_start":209},{"id":"network:references/troubleshooting.md:210:proxy-environment-variable","file":"references/troubleshooting.md","pattern":"Proxy environment variable","snippet":"export HTTPS_PROXY=http://proxy:port","category":"network","line_end":210,"severity":"medium","line_start":210},{"id":"filesystem:references/troubleshooting.md:101:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":101,"severity":"high","line_start":101},{"id":"filesystem:references/troubleshooting.md:223:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cp ~/.claude/skills/notebooklm/data/library.json library.backup.json","category":"filesystem","line_end":223,"severity":"high","line_start":223},{"id":"filesystem:references/troubleshooting.md:226:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"rm ~/.claude/skills/notebooklm/data/library.json","category":"filesystem","line_end":226,"severity":"high","line_start":226},{"id":"filesystem:references/troubleshooting.md:236:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"df -h ~/.claude/skills/notebooklm/data/","category":"filesystem","line_end":236,"severity":"high","line_start":236},{"id":"filesystem:references/troubleshooting.md:282:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"if [ -f ~/.claude/skills/notebooklm/data/library.json ]; then","category":"filesystem","line_end":282,"severity":"high","line_start":282},{"id":"filesystem:references/troubleshooting.md:283:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cp ~/.claude/skills/notebooklm/data/library.json ~/library.backup.json","category":"filesystem","line_end":283,"severity":"high","line_start":283},{"id":"filesystem:references/troubleshooting.md:287:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":287,"severity":"high","line_start":287},{"id":"filesystem:references/troubleshooting.md:298:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"mkdir -p ~/.claude/skills/notebooklm/data/","category":"filesystem","line_end":298,"severity":"high","line_start":298},{"id":"filesystem:references/troubleshooting.md:299:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cp ~/library.backup.json ~/.claude/skills/notebooklm/data/library.json","category":"filesystem","line_end":299,"severity":"high","line_start":299},{"id":"filesystem:references/troubleshooting.md:306:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":306,"severity":"high","line_start":306},{"id":"filesystem:references/troubleshooting.md:353:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":353,"severity":"high","line_start":353},{"id":"filesystem:references/troubleshooting.md:361:hidden-file-in-home-directory","file":"references/troubleshooting.md","pattern":"Hidden file in home directory","snippet":"ls -la ~/.claude/skills/notebooklm/data/","category":"filesystem","line_end":361,"severity":"high","line_start":361},{"id":"filesystem:references/troubleshooting.md:101:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":101,"severity":"medium","line_start":101},{"id":"filesystem:references/troubleshooting.md:223:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cp ~/.claude/skills/notebooklm/data/library.json library.backup.json","category":"filesystem","line_end":223,"severity":"medium","line_start":223},{"id":"filesystem:references/troubleshooting.md:226:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"rm ~/.claude/skills/notebooklm/data/library.json","category":"filesystem","line_end":226,"severity":"medium","line_start":226},{"id":"filesystem:references/troubleshooting.md:236:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"df -h ~/.claude/skills/notebooklm/data/","category":"filesystem","line_end":236,"severity":"medium","line_start":236},{"id":"filesystem:references/troubleshooting.md:282:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"if [ -f ~/.claude/skills/notebooklm/data/library.json ]; then","category":"filesystem","line_end":282,"severity":"medium","line_start":282},{"id":"filesystem:references/troubleshooting.md:283:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cp ~/.claude/skills/notebooklm/data/library.json ~/library.backup.json","category":"filesystem","line_end":283,"severity":"medium","line_start":283},{"id":"filesystem:references/troubleshooting.md:287:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":287,"severity":"medium","line_start":287},{"id":"filesystem:references/troubleshooting.md:298:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"mkdir -p ~/.claude/skills/notebooklm/data/","category":"filesystem","line_end":298,"severity":"medium","line_start":298},{"id":"filesystem:references/troubleshooting.md:299:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cp ~/library.backup.json ~/.claude/skills/notebooklm/data/library.json","category":"filesystem","line_end":299,"severity":"medium","line_start":299},{"id":"filesystem:references/troubleshooting.md:306:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":306,"severity":"medium","line_start":306},{"id":"filesystem:references/troubleshooting.md:353:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"cd ~/.claude/skills/notebooklm","category":"filesystem","line_end":353,"severity":"medium","line_start":353},{"id":"filesystem:references/troubleshooting.md:361:hidden-file-access","file":"references/troubleshooting.md","pattern":"Hidden file access","snippet":"ls -la ~/.claude/skills/notebooklm/data/","category":"filesystem","line_end":361,"severity":"medium","line_start":361},{"id":"blocker:references/troubleshooting.md:166:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py activate --id correct-id","category":"blocker","line_end":166,"severity":"low","line_start":166},{"id":"blocker:references/troubleshooting.md:318:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"| Not authenticated | No valid auth | `run.py auth_manager.py setup` |","category":"blocker","line_end":318,"severity":"low","line_start":318},{"id":"blocker:references/troubleshooting.md:320:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"| Invalid credentials | Wrong account | Check Google account |","category":"blocker","line_end":320,"severity":"low","line_start":320},{"id":"blocker:references/troubleshooting.md:334:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"| Notebook not found | Invalid ID | `run.py notebook_manager.py list` |","category":"blocker","line_end":334,"severity":"low","line_start":334},{"id":"blocker:references/troubleshooting.md:336:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"| Invalid URL | Wrong format | Use full NotebookLM URL |","category":"blocker","line_end":336,"severity":"low","line_start":336},{"id":"blocker:references/troubleshooting.md:343:system-reconnaissance","file":"references/troubleshooting.md","pattern":"System reconnaissance","snippet":"3. **Monitor queries** - Track daily count to avoid limits","category":"blocker","line_end":343,"severity":"low","line_start":343},{"id":"external_commands:references/usage_patterns.md:177:python-subprocess-run","file":"references/usage_patterns.md","pattern":"Python subprocess.run","snippet":"result = subprocess.run([","category":"external_commands","line_end":177,"severity":"high","line_start":177},{"id":"external_commands:references/usage_patterns.md:210:python-subprocess-run","file":"references/usage_patterns.md","pattern":"Python subprocess.run","snippet":"result = subprocess.run([","category":"external_commands","line_end":210,"severity":"high","line_start":210},{"id":"external_commands:references/usage_patterns.md:219:python-subprocess-run","file":"references/usage_patterns.md","pattern":"Python subprocess.run","snippet":"follow_up = subprocess.run([","category":"external_commands","line_end":219,"severity":"high","line_start":219},{"id":"external_commands:references/usage_patterns.md:143:unix-shell-invocation","file":"references/usage_patterns.md","pattern":"Unix shell invocation","snippet":"#!/bin/bash","category":"external_commands","line_end":143,"severity":"medium","line_start":143},{"id":"network:references/usage_patterns.md:31:hardcoded-url","file":"references/usage_patterns.md","pattern":"Hardcoded URL","snippet":"--url \"https://notebooklm.google.com/notebook/...\" \\","category":"network","line_end":31,"severity":"low","line_start":31},{"id":"blocker:references/usage_patterns.md:89:system-reconnaissance","file":"references/usage_patterns.md","pattern":"System reconnaissance","snippet":"--notebook-id notebook-id","category":"blocker","line_end":89,"severity":"low","line_start":89},{"id":"blocker:references/usage_patterns.md:115:system-reconnaissance","file":"references/usage_patterns.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py activate --id notebook-1","category":"blocker","line_end":115,"severity":"low","line_start":115},{"id":"blocker:references/usage_patterns.md:118:system-reconnaissance","file":"references/usage_patterns.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py activate --id notebook-2","category":"blocker","line_end":118,"severity":"low","line_start":118},{"id":"blocker:references/usage_patterns.md:155:system-reconnaissance","file":"references/usage_patterns.md","pattern":"System reconnaissance","snippet":"--notebook-id \"$NOTEBOOK_ID\"","category":"blocker","line_end":155,"severity":"low","line_start":155},{"id":"blocker:references/usage_patterns.md:156:system-reconnaissance","file":"references/usage_patterns.md","pattern":"System reconnaissance","snippet":"sleep 2  # Avoid rate limits","category":"blocker","line_end":156,"severity":"low","line_start":156},{"id":"blocker:references/usage_patterns.md:180:system-reconnaissance","file":"references/usage_patterns.md","pattern":"System reconnaissance","snippet":"\"--notebook-id\", notebook_id","category":"blocker","line_end":181,"severity":"low","line_start":180},{"id":"env_access:requirements.txt:10:dotenv-library","file":"requirements.txt","pattern":"dotenv library","snippet":"python-dotenv==1.0.0","category":"env_access","line_end":10,"severity":"low","line_start":10},{"id":"external_commands:scripts/__init__.py:53:python-subprocess-run","file":"scripts/__init__.py","pattern":"Python subprocess.run","snippet":"subprocess.run(","category":"external_commands","line_end":53,"severity":"high","line_start":53},{"id":"external_commands:scripts/__init__.py:65:python-subprocess-run","file":"scripts/__init__.py","pattern":"Python subprocess.run","snippet":"subprocess.run(","category":"external_commands","line_end":65,"severity":"high","line_start":65},{"id":"network:scripts/ask_question.py:9:hardcoded-url","file":"scripts/ask_question.py","pattern":"Hardcoded URL","snippet":"See: https://github.com/microsoft/playwright/issues/36139","category":"network","line_end":9,"severity":"low","line_start":9},{"id":"network:scripts/ask_question.py:80:hardcoded-url","file":"scripts/ask_question.py","pattern":"Hardcoded URL","snippet":"page.wait_for_url(re.compile(r\"^https://notebooklm\\.google\\.com/\"), timeout=10000)","category":"network","line_end":80,"severity":"low","line_start":80},{"id":"sensitive:scripts/ask_question.py:112:certificate-key-files","file":"scripts/ask_question.py","pattern":"Certificate/key files","snippet":"page.keyboard.press(\"Enter\")","category":"sensitive","line_end":112,"severity":"high","line_start":112},{"id":"blocker:scripts/ask_question.py:6:system-reconnaissance","file":"scripts/ask_question.py","pattern":"System reconnaissance","snippet":"Implements hybrid auth approach:","category":"blocker","line_end":6,"severity":"low","line_start":6},{"id":"blocker:scripts/ask_question.py:225:system-reconnaissance","file":"scripts/ask_question.py","pattern":"System reconnaissance","snippet":"mark = \" [ACTIVE]\" if nb.get('id') == library.active_notebook_id else \"\"","category":"blocker","line_end":225,"severity":"low","line_start":225},{"id":"blocker:scripts/ask_question.py:227:system-reconnaissance","file":"scripts/ask_question.py","pattern":"System reconnaissance","snippet":"print(\"\\nSpecify with --notebook-id or set active:\")","category":"blocker","line_end":227,"severity":"low","line_start":227},{"id":"blocker:scripts/ask_question.py:228:system-reconnaissance","file":"scripts/ask_question.py","pattern":"System reconnaissance","snippet":"print(\"python scripts/run.py notebook_manager.py activate --id ID\")","category":"blocker","line_end":228,"severity":"low","line_start":228},{"id":"network:scripts/auth_manager.py:10:hardcoded-url","file":"scripts/auth_manager.py","pattern":"Hardcoded URL","snippet":"See: https://github.com/microsoft/playwright/issues/36139","category":"network","line_end":10,"severity":"low","line_start":10},{"id":"network:scripts/auth_manager.py:114:hardcoded-url","file":"scripts/auth_manager.py","pattern":"Hardcoded URL","snippet":"page.goto(\"https://notebooklm.google.com\", wait_until=\"domcontentloaded\")","category":"network","line_end":114,"severity":"low","line_start":114},{"id":"network:scripts/auth_manager.py:129:hardcoded-url","file":"scripts/auth_manager.py","pattern":"Hardcoded URL","snippet":"page.wait_for_url(re.compile(r\"^https://notebooklm\\.google\\.com/\"), timeout=timeout_ms)","category":"network","line_end":129,"severity":"low","line_start":129},{"id":"network:scripts/auth_manager.py:260:hardcoded-url","file":"scripts/auth_manager.py","pattern":"Hardcoded URL","snippet":"page.goto(\"https://notebooklm.google.com\", wait_until=\"domcontentloaded\", timeout=30000)","category":"network","line_end":260,"severity":"low","line_start":260},{"id":"filesystem:scripts/auth_manager.py:177:python-file-write-append","file":"scripts/auth_manager.py","pattern":"Python file write/append","snippet":"with open(self.auth_info_file, 'w') as f:","category":"filesystem","line_end":177,"severity":"medium","line_start":177},{"id":"filesystem:scripts/auth_manager.py:204:python-shutil-operations","file":"scripts/auth_manager.py","pattern":"Python shutil operations","snippet":"shutil.rmtree(self.browser_state_dir)","category":"filesystem","line_end":204,"severity":"medium","line_start":204},{"id":"blocker:scripts/auth_manager.py:7:system-reconnaissance","file":"scripts/auth_manager.py","pattern":"System reconnaissance","snippet":"Implements hybrid auth approach:","category":"blocker","line_end":7,"severity":"low","line_start":7},{"id":"blocker:scripts/auth_manager.py:53:system-reconnaissance","file":"scripts/auth_manager.py","pattern":"System reconnaissance","snippet":"\"\"\"Check if valid authentication exists\"\"\"","category":"blocker","line_end":53,"severity":"low","line_start":53},{"id":"blocker:scripts/auth_manager.py:239:system-reconnaissance","file":"scripts/auth_manager.py","pattern":"System reconnaissance","snippet":"True if authentication is valid","category":"blocker","line_end":240,"severity":"low","line_start":239},{"id":"blocker:scripts/auth_manager.py:267:system-reconnaissance","file":"scripts/auth_manager.py","pattern":"System reconnaissance","snippet":"print(\"  ❌ Authentication is invalid (redirected to login)\")","category":"blocker","line_end":267,"severity":"low","line_start":267},{"id":"blocker:scripts/auth_manager.py:337:system-reconnaissance","file":"scripts/auth_manager.py","pattern":"System reconnaissance","snippet":"print(\"Authentication is valid and working\")","category":"blocker","line_end":337,"severity":"low","line_start":337},{"id":"blocker:scripts/auth_manager.py:339:system-reconnaissance","file":"scripts/auth_manager.py","pattern":"System reconnaissance","snippet":"print(\"Authentication is invalid or expired\")","category":"blocker","line_end":339,"severity":"low","line_start":339},{"id":"sensitive:scripts/browser_session.py:126:certificate-key-files","file":"scripts/browser_session.py","pattern":"Certificate/key files","snippet":"self.page.keyboard.press(\"Enter\")","category":"sensitive","line_end":126,"severity":"high","line_start":126},{"id":"blocker:scripts/browser_session.py:39:system-reconnaissance","file":"scripts/browser_session.py","pattern":"System reconnaissance","snippet":"self.id = session_id","category":"blocker","line_end":39,"severity":"low","line_start":39},{"id":"blocker:scripts/browser_session.py:99:system-reconnaissance","file":"scripts/browser_session.py","pattern":"System reconnaissance","snippet":"Dict with status, question, answer, session_id","category":"blocker","line_end":100,"severity":"low","line_start":99},{"id":"blocker:scripts/browser_session.py:154:system-reconnaissance","file":"scripts/browser_session.py","pattern":"System reconnaissance","snippet":"\"session_id\": self.id","category":"blocker","line_end":155,"severity":"low","line_start":154},{"id":"filesystem:scripts/cleanup_manager.py:173:python-shutil-operations","file":"scripts/cleanup_manager.py","pattern":"Python shutil operations","snippet":"shutil.rmtree(path)","category":"filesystem","line_end":173,"severity":"medium","line_start":173},{"id":"filesystem:scripts/notebook_manager.py:58:python-file-write-append","file":"scripts/notebook_manager.py","pattern":"Python file write/append","snippet":"with open(self.library_file, 'w') as f:","category":"filesystem","line_end":58,"severity":"medium","line_start":58},{"id":"sensitive:scripts/notebook_manager.py:141:certificate-key-files","file":"scripts/notebook_manager.py","pattern":"Certificate/key files","snippet":"self.active_notebook_id = list(self.notebooks.keys())[0]","category":"sensitive","line_end":141,"severity":"high","line_start":141},{"id":"blocker:scripts/notebook_manager.py:10:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"import uuid","category":"blocker","line_end":11,"severity":"low","line_start":10},{"id":"blocker:scripts/notebook_manager.py:41:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"self.active_notebook_id = data.get('active_notebook_id')","category":"blocker","line_end":41,"severity":"low","line_start":41},{"id":"blocker:scripts/notebook_manager.py:46:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"self.active_notebook_id = None","category":"blocker","line_end":46,"severity":"low","line_start":46},{"id":"blocker:scripts/notebook_manager.py:89:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"notebook_id = name.lower().replace(' ', '-').replace('_', '-')","category":"blocker","line_end":89,"severity":"low","line_start":89},{"id":"blocker:scripts/notebook_manager.py:92:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"if notebook_id in self.notebooks:","category":"blocker","line_end":92,"severity":"low","line_start":92},{"id":"blocker:scripts/notebook_manager.py:116:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"self.active_notebook_id = notebook_id","category":"blocker","line_end":116,"severity":"low","line_start":116},{"id":"blocker:scripts/notebook_manager.py:133:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"if notebook_id in self.notebooks:","category":"blocker","line_end":133,"severity":"low","line_start":133},{"id":"blocker:scripts/notebook_manager.py:137:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"if self.active_notebook_id == notebook_id:","category":"blocker","line_end":137,"severity":"low","line_start":137},{"id":"blocker:scripts/notebook_manager.py:138:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"self.active_notebook_id = None","category":"blocker","line_end":138,"severity":"low","line_start":138},{"id":"blocker:scripts/notebook_manager.py:141:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"self.active_notebook_id = list(self.notebooks.keys())[0]","category":"blocker","line_end":141,"severity":"low","line_start":141},{"id":"blocker:scripts/notebook_manager.py:171:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"if notebook_id not in self.notebooks:","category":"blocker","line_end":171,"severity":"low","line_start":171},{"id":"blocker:scripts/notebook_manager.py:244:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"if notebook_id not in self.notebooks:","category":"blocker","line_end":244,"severity":"low","line_start":244},{"id":"blocker:scripts/notebook_manager.py:247:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"self.active_notebook_id = notebook_id","category":"blocker","line_end":247,"severity":"low","line_start":247},{"id":"blocker:scripts/notebook_manager.py:270:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"if notebook_id not in self.notebooks:","category":"blocker","line_end":270,"severity":"low","line_start":270},{"id":"blocker:scripts/notebook_manager.py:367:system-reconnaissance","file":"scripts/notebook_manager.py","pattern":"System reconnaissance","snippet":"active = \" [ACTIVE]\" if notebook['id'] == library.active_notebook_id else \"\"","category":"blocker","line_end":367,"severity":"low","line_start":367},{"id":"external_commands:scripts/run.py:38:python-subprocess-run","file":"scripts/run.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run([sys.executable, str(setup_script)])","category":"external_commands","line_end":38,"severity":"high","line_start":38},{"id":"external_commands:scripts/run.py:91:python-subprocess-run","file":"scripts/run.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run(cmd)","category":"external_commands","line_end":91,"severity":"high","line_start":91},{"id":"external_commands:scripts/setup_environment.py:54:python-subprocess-run","file":"scripts/setup_environment.py","pattern":"Python subprocess.run","snippet":"subprocess.run(","category":"external_commands","line_end":54,"severity":"high","line_start":54},{"id":"external_commands:scripts/setup_environment.py:62:python-subprocess-run","file":"scripts/setup_environment.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run(","category":"external_commands","line_end":62,"severity":"high","line_start":62},{"id":"external_commands:scripts/setup_environment.py:75:python-subprocess-run","file":"scripts/setup_environment.py","pattern":"Python subprocess.run","snippet":"subprocess.run(","category":"external_commands","line_end":75,"severity":"high","line_start":75},{"id":"external_commands:scripts/setup_environment.py:132:python-subprocess-run","file":"scripts/setup_environment.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run(cmd)","category":"external_commands","line_end":132,"severity":"high","line_start":132},{"id":"network:scripts/setup_environment.py:72:hardcoded-url","file":"scripts/setup_environment.py","pattern":"Hardcoded URL","snippet":"# See: https://github.com/Kaliiiiiiiiii-Vinyzu/patchright-python#anti-detection","category":"network","line_end":72,"severity":"low","line_start":72},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Shares NotebookLM URL (`https://notebooklm.google.com/notebook/...`)","category":"external_commands","line_end":14,"severity":"medium","line_start":14},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":30,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":33,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `--url` - The NotebookLM URL","category":"external_commands","line_end":34,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `--name` - A descriptive name","category":"external_commands","line_end":35,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `--description` - What the notebook contains (REQUIRED!)","category":"external_commands","line_end":36,"severity":"medium","line_start":35},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `--topics` - Comma-separated topics (REQUIRED!)","category":"external_commands","line_end":42,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**NEVER call scripts directly. ALWAYS use `python scripts/run.py [script]`:**","category":"external_commands","line_end":44,"severity":"medium","line_start":42},{"id":"external_commands:SKILL.md:44:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":52,"severity":"medium","line_start":44},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":54,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The `run.py` wrapper automatically:","category":"external_commands","line_end":55,"severity":"medium","line_start":54},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Creates `.venv` if needed","category":"external_commands","line_end":63,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":65,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":70,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:70:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":73,"severity":"medium","line_start":70},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":83,"severity":"medium","line_start":73},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":106,"severity":"medium","line_start":83},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":109,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Check library: `python scripts/run.py notebook_manager.py list`","category":"external_commands","line_end":110,"severity":"medium","line_start":109},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. Ask question: `python scripts/run.py ask_question.py --question \"...\" --notebook-id ID`","category":"external_commands","line_end":114,"severity":"medium","line_start":110},{"id":"external_commands:SKILL.md:114:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":126,"severity":"medium","line_start":114},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":137,"severity":"medium","line_start":126},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":139,"severity":"medium","line_start":137},{"id":"external_commands:SKILL.md:139:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":145,"severity":"medium","line_start":139},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### Authentication Management (`auth_manager.py`)","category":"external_commands","line_end":146,"severity":"medium","line_start":145},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":151,"severity":"medium","line_start":146},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":153,"severity":"medium","line_start":151},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### Notebook Management (`notebook_manager.py`)","category":"external_commands","line_end":154,"severity":"medium","line_start":153},{"id":"external_commands:SKILL.md:154:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":161,"severity":"medium","line_start":154},{"id":"external_commands:SKILL.md:161:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":163,"severity":"medium","line_start":161},{"id":"external_commands:SKILL.md:163:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### Question Interface (`ask_question.py`)","category":"external_commands","line_end":164,"severity":"medium","line_start":163},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":166,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:166:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":168,"severity":"medium","line_start":166},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### Data Cleanup (`cleanup_manager.py`)","category":"external_commands","line_end":169,"severity":"medium","line_start":168},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":173,"severity":"medium","line_start":169},{"id":"external_commands:SKILL.md:173:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":178,"severity":"medium","line_start":173},{"id":"external_commands:SKILL.md:178:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- First run creates `.venv` automatically","category":"external_commands","line_end":184,"severity":"medium","line_start":178},{"id":"external_commands:SKILL.md:184:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":189,"severity":"medium","line_start":184},{"id":"external_commands:SKILL.md:189:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":193,"severity":"medium","line_start":189},{"id":"external_commands:SKILL.md:193:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"All data stored in `~/.claude/skills/notebooklm/data/`:","category":"external_commands","line_end":194,"severity":"medium","line_start":193},{"id":"external_commands:SKILL.md:194:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `library.json` - Notebook metadata","category":"external_commands","line_end":195,"severity":"medium","line_start":194},{"id":"external_commands:SKILL.md:195:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `auth_info.json` - Authentication status","category":"external_commands","line_end":196,"severity":"medium","line_start":195},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `browser_state/` - Browser cookies and session","category":"external_commands","line_end":198,"severity":"medium","line_start":196},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Security:** Protected by `.gitignore`, never commit to git.","category":"external_commands","line_end":202,"severity":"medium","line_start":198},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Optional `.env` file in skill directory:","category":"external_commands","line_end":203,"severity":"medium","line_start":202},{"id":"external_commands:SKILL.md:203:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```env","category":"external_commands","line_end":210,"severity":"medium","line_start":203},{"id":"external_commands:SKILL.md:210:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":214,"severity":"medium","line_start":210},{"id":"external_commands:SKILL.md:214:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":230,"severity":"medium","line_start":214},{"id":"external_commands:SKILL.md:230:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":236,"severity":"medium","line_start":230},{"id":"external_commands:SKILL.md:236:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| ModuleNotFoundError | Use `run.py` wrapper |","category":"external_commands","line_end":239,"severity":"medium","line_start":236},{"id":"external_commands:SKILL.md:239:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Browser crashes | `python scripts/run.py cleanup_manager.py --preserve-library` |","category":"external_commands","line_end":240,"severity":"medium","line_start":239},{"id":"external_commands:SKILL.md:240:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Notebook not found | Check with `notebook_manager.py list` |","category":"external_commands","line_end":262,"severity":"medium","line_start":240},{"id":"external_commands:SKILL.md:262:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `scripts/` - All automation scripts (ask_question.py, notebook_manager.py, etc.)","category":"external_commands","line_end":263,"severity":"medium","line_start":262},{"id":"external_commands:SKILL.md:263:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `data/` - Local storage for authentication and notebook library","category":"external_commands","line_end":264,"severity":"medium","line_start":263},{"id":"external_commands:SKILL.md:264:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `references/` - Extended documentation:","category":"external_commands","line_end":265,"severity":"medium","line_start":264},{"id":"external_commands:SKILL.md:265:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `api_reference.md` - Detailed API documentation for all scripts","category":"external_commands","line_end":266,"severity":"medium","line_start":265},{"id":"external_commands:SKILL.md:266:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `troubleshooting.md` - Common issues and solutions","category":"external_commands","line_end":267,"severity":"medium","line_start":266},{"id":"external_commands:SKILL.md:267:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `usage_patterns.md` - Best practices and workflow examples","category":"external_commands","line_end":268,"severity":"medium","line_start":267},{"id":"external_commands:SKILL.md:268:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `.venv/` - Isolated Python environment (auto-created on first run)","category":"external_commands","line_end":269,"severity":"medium","line_start":268},{"id":"network:SKILL.md:14:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- Shares NotebookLM URL (`https://notebooklm.google.com/notebook/...`)","category":"network","line_end":14,"severity":"low","line_start":14},{"id":"network:SKILL.md:93:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"--url \"https://notebooklm.google.com/notebook/...\" \\","category":"network","line_end":93,"severity":"low","line_start":93},{"id":"network:SKILL.md:122:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"python scripts/run.py ask_question.py --question \"...\" --notebook-url \"https://...\"","category":"network","line_end":122,"severity":"low","line_start":122},{"id":"filesystem:SKILL.md:193:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"All data stored in `~/.claude/skills/notebooklm/data/`:","category":"filesystem","line_end":193,"severity":"high","line_start":193},{"id":"filesystem:SKILL.md:193:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"All data stored in `~/.claude/skills/notebooklm/data/`:","category":"filesystem","line_end":193,"severity":"medium","line_start":193},{"id":"sensitive:SKILL.md:202:environment-file-access","file":"SKILL.md","pattern":"Environment file access","snippet":"Optional `.env` file in skill directory:","category":"sensitive","line_end":202,"severity":"high","line_start":202},{"id":"blocker:SKILL.md:102:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py activate --id notebook-id","category":"blocker","line_end":102,"severity":"low","line_start":102},{"id":"blocker:SKILL.md:105:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py remove --id notebook-id","category":"blocker","line_end":105,"severity":"low","line_start":105},{"id":"blocker:SKILL.md:110:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"2. Ask question: `python scripts/run.py ask_question.py --question \"...\" --notebook-id ID`","category":"blocker","line_end":110,"severity":"low","line_start":110},{"id":"blocker:SKILL.md:119:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"python scripts/run.py ask_question.py --question \"...\" --notebook-id notebook-id","category":"blocker","line_end":119,"severity":"low","line_start":119},{"id":"blocker:SKILL.md:158:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py activate --id ID","category":"blocker","line_end":158,"severity":"low","line_start":158},{"id":"blocker:SKILL.md:159:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"python scripts/run.py notebook_manager.py remove --id ID","category":"blocker","line_end":159,"severity":"low","line_start":159},{"id":"blocker:SKILL.md:165:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"python scripts/run.py ask_question.py --question \"...\" [--notebook-id ID] [--notebook-url URL] [--sh","category":"blocker","line_end":165,"severity":"low","line_start":165},{"id":"blocker:SKILL.md:223:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"Activate notebook → python scripts/run.py notebook_manager.py activate --id ID","category":"blocker","line_end":223,"severity":"low","line_start":223}],"finding_verdicts":[{"id":"external_commands:references/api_reference.md:160:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/api_reference.md:216:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/api_reference.md:228:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/api_reference.md:249:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/api_reference.md:271:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"network:references/api_reference.md:30:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:references/api_reference.md:52:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:references/api_reference.md:59:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:references/api_reference.md:185:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/api_reference.md:185:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"sensitive:references/api_reference.md:199:environment-file-access","reason":"The .env section documents optional non-secret configuration keys. No reviewed code loads or reads secrets from an environment file at this location.","verdict":"false_positive","confidence":0.82},{"id":"blocker:references/api_reference.md:27:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/api_reference.md:71:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/api_reference.md:74:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/api_reference.md:252:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/api_reference.md:274:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/api_reference.md:277:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:references/troubleshooting.md:132:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/troubleshooting.md:277:unix-shell-invocation","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"network:references/troubleshooting.md:148:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:references/troubleshooting.md:209:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:references/troubleshooting.md:210:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:references/troubleshooting.md:209:proxy-environment-variable","reason":"This is a troubleshooting example showing user-set proxy variables. The skill does not set or exfiltrate proxy configuration at this location.","verdict":"false_positive","confidence":0.88},{"id":"network:references/troubleshooting.md:210:proxy-environment-variable","reason":"This is a troubleshooting example showing user-set proxy variables. The skill does not set or exfiltrate proxy configuration at this location.","verdict":"false_positive","confidence":0.88},{"id":"filesystem:references/troubleshooting.md:101:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:223:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:226:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:236:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:282:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:283:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:287:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:298:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:299:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:306:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:353:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:361:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:101:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:223:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:226:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:236:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:282:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:283:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:287:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:298:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:299:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:306:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:353:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:references/troubleshooting.md:361:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"blocker:references/troubleshooting.md:166:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/troubleshooting.md:318:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/troubleshooting.md:320:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/troubleshooting.md:334:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/troubleshooting.md:336:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/troubleshooting.md:343:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:references/usage_patterns.md:177:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/usage_patterns.md:210:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/usage_patterns.md:219:python-subprocess-run","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:references/usage_patterns.md:143:unix-shell-invocation","reason":"This is a Markdown documentation example, not code that runs when the skill loads. Executable subprocess risks are covered in the actual scripts.","verdict":"false_positive","confidence":0.88},{"id":"network:references/usage_patterns.md:31:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"blocker:references/usage_patterns.md:89:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/usage_patterns.md:115:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/usage_patterns.md:118:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/usage_patterns.md:155:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/usage_patterns.md:156:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:references/usage_patterns.md:180:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"env_access:requirements.txt:10:dotenv-library","reason":"The dependency list includes python-dotenv, but the reviewed code does not call load_dotenv or read secrets from environment files.","verdict":"false_positive","confidence":0.86},{"id":"external_commands:scripts/__init__.py:53:python-subprocess-run","reason":"On import, the package runs pip install against requirements.txt in the skill venv. Automatic dependency installation executes external package code and is a real supply-chain risk.","verdict":"confirmed","severity":"high","confidence":0.93},{"id":"external_commands:scripts/__init__.py:65:python-subprocess-run","reason":"On import, the package runs patchright browser installation through subprocess. This downloads and executes external setup commands as a side effect.","verdict":"confirmed","severity":"high","confidence":0.91},{"id":"network:scripts/ask_question.py:9:hardcoded-url","reason":"This line is a comment linking to upstream documentation or an issue. It does not perform a network request.","verdict":"false_positive","confidence":0.96},{"id":"network:scripts/ask_question.py:80:hardcoded-url","reason":"The code validates that navigation reaches notebooklm.google.com during a query. This is intended, but it confirms external Google network access for user questions and notebooks.","verdict":"confirmed","severity":"low","confidence":0.88},{"id":"sensitive:scripts/ask_question.py:112:certificate-key-files","reason":"The line presses Enter or updates a notebook identifier and does not reference certificate, private key, or credential files. The keyword match is incidental.","verdict":"false_positive","confidence":0.98},{"id":"blocker:scripts/ask_question.py:6:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/ask_question.py:225:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/ask_question.py:227:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/ask_question.py:228:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"network:scripts/auth_manager.py:10:hardcoded-url","reason":"This line is a comment linking to upstream documentation or an issue. It does not perform a network request.","verdict":"false_positive","confidence":0.96},{"id":"network:scripts/auth_manager.py:114:hardcoded-url","reason":"The authentication flow opens notebooklm.google.com in a persistent browser context. This is intended, but it sends browser traffic to an external Google service.","verdict":"confirmed","severity":"low","confidence":0.9},{"id":"network:scripts/auth_manager.py:129:hardcoded-url","reason":"The login flow waits for a NotebookLM URL after Google authentication. This confirms external network use tied to a user account.","verdict":"confirmed","severity":"low","confidence":0.84},{"id":"network:scripts/auth_manager.py:260:hardcoded-url","reason":"The validation flow opens notebooklm.google.com to check stored authentication. This is intended, but it uses external network access with saved browser state.","verdict":"confirmed","severity":"low","confidence":0.9},{"id":"filesystem:scripts/auth_manager.py:177:python-file-write-append","reason":"The skill writes authentication metadata to a local auth_info file. The path is scoped, but it persists account-related state on disk.","verdict":"confirmed","severity":"medium","confidence":0.78},{"id":"filesystem:scripts/auth_manager.py:204:python-shutil-operations","reason":"clear_auth removes the browser state directory with shutil.rmtree. The path is scoped to skill data, but it is a destructive operation over stored session material.","verdict":"confirmed","severity":"medium","confidence":0.8},{"id":"blocker:scripts/auth_manager.py:7:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/auth_manager.py:53:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/auth_manager.py:239:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/auth_manager.py:267:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/auth_manager.py:337:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/auth_manager.py:339:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"sensitive:scripts/browser_session.py:126:certificate-key-files","reason":"The line presses Enter or updates a notebook identifier and does not reference certificate, private key, or credential files. The keyword match is incidental.","verdict":"false_positive","confidence":0.98},{"id":"blocker:scripts/browser_session.py:39:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/browser_session.py:99:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/browser_session.py:154:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:scripts/cleanup_manager.py:173:python-shutil-operations","reason":"The cleanup command deletes discovered data paths with shutil.rmtree. It is scoped and usually confirmed, but it can remove browser state, sessions, and library data.","verdict":"confirmed","severity":"medium","confidence":0.78},{"id":"filesystem:scripts/notebook_manager.py:58:python-file-write-append","reason":"The library manager writes notebook URLs and metadata to disk. The file is scoped, but it persists user research context and access URLs locally.","verdict":"confirmed","severity":"medium","confidence":0.76},{"id":"sensitive:scripts/notebook_manager.py:141:certificate-key-files","reason":"The line presses Enter or updates a notebook identifier and does not reference certificate, private key, or credential files. The keyword match is incidental.","verdict":"false_positive","confidence":0.98},{"id":"blocker:scripts/notebook_manager.py:10:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:41:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:46:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:89:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:92:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:116:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:133:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:137:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:138:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:141:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:171:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:244:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:247:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:270:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:scripts/notebook_manager.py:367:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:scripts/run.py:38:python-subprocess-run","reason":"run.py automatically invokes setup_environment.py when the venv is missing. That bootstrap path can install dependencies and browser binaries before the requested task runs.","verdict":"confirmed","severity":"high","confidence":0.9},{"id":"external_commands:scripts/run.py:91:python-subprocess-run","reason":"run.py executes a command built from the requested script name and arguments. It is scoped to the scripts directory, but there is no explicit allowlist before subprocess execution.","verdict":"confirmed","severity":"high","confidence":0.86},{"id":"external_commands:scripts/setup_environment.py:54:python-subprocess-run","reason":"The setup code upgrades pip through subprocess. This is intended setup behavior, but it executes package-management commands from skill code.","verdict":"confirmed","severity":"high","confidence":0.92},{"id":"external_commands:scripts/setup_environment.py:62:python-subprocess-run","reason":"The setup code installs requirements.txt through pip. Installing dependencies at runtime is a real external code execution and supply-chain risk.","verdict":"confirmed","severity":"high","confidence":0.95},{"id":"external_commands:scripts/setup_environment.py:75:python-subprocess-run","reason":"The setup code runs patchright install chrome through subprocess. This downloads browser binaries and extends the local execution surface.","verdict":"confirmed","severity":"high","confidence":0.94},{"id":"external_commands:scripts/setup_environment.py:132:python-subprocess-run","reason":"setup_environment.py can run a requested script through the venv Python. This is local command execution selected at runtime.","verdict":"confirmed","severity":"high","confidence":0.84},{"id":"network:scripts/setup_environment.py:72:hardcoded-url","reason":"This line is a comment linking to upstream documentation or an issue. It does not perform a network request.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:44:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:54:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:70:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:114:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:139:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:153:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:154:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:161:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:163:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:166:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:173:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:178:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:184:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:189:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:193:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:194:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:195:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:196:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:203:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:210:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:214:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:230:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:236:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:239:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:240:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:262:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:263:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:264:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:265:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:266:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:267:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:268:ruby-shell-backtick-execution","reason":"The match is Markdown backtick or code-fence formatting in the skill instructions. The executable command risks are adjudicated in run.py and setup_environment.py.","verdict":"false_positive","confidence":0.9},{"id":"network:SKILL.md:14:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:SKILL.md:93:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"network:SKILL.md:122:hardcoded-url","reason":"The hardcoded URL appears in documentation or an example NotebookLM URL. It identifies the intended service and does not itself make a request.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:SKILL.md:193:hidden-file-in-home-directory","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"filesystem:SKILL.md:193:hidden-file-access","reason":"This is documentation about the skill data directory or recovery commands. It is not code that accesses arbitrary hidden files.","verdict":"false_positive","confidence":0.84},{"id":"sensitive:SKILL.md:202:environment-file-access","reason":"The .env section documents optional non-secret configuration keys. No reviewed code loads or reads secrets from an environment file at this location.","verdict":"false_positive","confidence":0.82},{"id":"blocker:SKILL.md:102:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:105:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:110:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:119:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:158:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:159:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:165:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95},{"id":"blocker:SKILL.md:223:system-reconnaissance","reason":"The line references notebook IDs, status text, examples, or rate-limit handling. It does not collect host, account, or system reconnaissance data.","verdict":"false_positive","confidence":0.95}],"semantic_findings":[{"title":"Persistent Google Session Storage","severity":"high","locations":[{"file":"scripts/auth_manager.py","line_end":165,"line_start":160},{"file":"SKILL.md","line_end":198,"line_start":193}],"confidence":0.93,"description":"The skill saves browser storage state for NotebookLM authentication and documents browser cookies and session data in local skill storage. This keeps Google session material on disk and increases exposure if local files are read.","confidence_reasoning":"auth_manager.py directly saves browser storage state to disk, and SKILL.md identifies browser cookies and session storage. This is clear persistent credential-adjacent material."},{"title":"Unvalidated Notebook URL Opened With Authenticated Browser","severity":"high","locations":[{"file":"scripts/ask_question.py","line_end":47,"line_start":40},{"file":"scripts/ask_question.py","line_end":80,"line_start":75},{"file":"scripts/notebook_manager.py","line_end":99,"line_start":63}],"confidence":0.86,"description":"The question interface accepts a notebook URL and opens it in the browser before the NotebookLM domain wait succeeds. A malicious or mistaken URL can load in an authenticated browser profile before validation fails.","confidence_reasoning":"The URL is supplied by arguments or library metadata and page.goto runs before domain enforcement. The risk is bounded by browser origin controls but still exposes the authenticated browser session to arbitrary navigation."},{"title":"Stealth Browser Automation Against Google NotebookLM","severity":"high","locations":[{"file":"scripts/setup_environment.py","line_end":76,"line_start":70},{"file":"SKILL.md","line_end":207,"line_start":202},{"file":"scripts/ask_question.py","line_end":115,"line_start":103}],"confidence":0.9,"description":"The skill installs a browser for Patchright anti-detection use, configures stealth-related settings, and simulates human typing. This increases abuse and account-policy risk for an external Google service.","confidence_reasoning":"The comments and configuration explicitly reference anti-detection and stealth behavior, and ask_question.py uses human-like typing and delay logic. The intent is clear even though it supports the stated feature."},{"title":"Tool Output Can Steer Agent Follow-Up Behavior","severity":"medium","locations":[{"file":"scripts/ask_question.py","line_end":37,"line_start":29},{"file":"scripts/ask_question.py","line_end":167,"line_start":165},{"file":"SKILL.md","line_end":141,"line_start":128}],"confidence":0.82,"description":"The skill appends a strong follow-up instruction to NotebookLM answers and tells the agent to stop, analyze, and ask more questions before responding. NotebookLM answers originate from uploaded documents, so source content can influence agent control flow unless treated as untrusted.","confidence_reasoning":"The follow-up instruction is explicit in both code and skill instructions. I did not find a malicious prompt injection string, but the design creates a reliable path for untrusted source text to affect agent behavior."}],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"confirmed_risk_level does not match the canonical trust resolver"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":4,"capabilityReviewCount":16,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}