{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "notebooklm-skill",
  "built": "2026-10-26",
  "control_level": 5,
  "control_level_label": "L5 严管",
  "capabilities": [
    "terms_compliance",
    "credential",
    "execute_command",
    "install_deps",
    "network",
    "write_file"
  ],
  "required_controls": {
    "agent": [
      "isolated_environment",
      "per_use_authorization"
    ],
    "admin": [
      "strict_authorization",
      "full_audit",
      "compliance_signoff"
    ]
  },
  "evidence": [
    {
      "file": "SKILL.md / 脚本参数",
      "summary": "Involves bypassing automation detection, disabling host sandbox, or skipping SSL certificate validation"
    },
    {
      "file": "SKILL.md / 会话存储",
      "summary": "Reads or reuses browser user login state and session cookies"
    },
    {
      "file": "本地凭据 / 浏览器配置",
      "summary": "Reads user login cookies/sessions/keyrings: The cookie database in the browser profile is read and written by Chrome itself (user_data_dir points to <skill>/data/browse"
    },
    {
      "file": "scripts/",
      "summary": "Executes local scripts or commands: run.py runs setup_environment.py using the system interpreter when .venv is missing: `result = subprocess.run([sy"
    },
    {
      "file": "scripts/ 或 SKILL.md",
      "summary": "Declares dynamic installation of external language package dependencies"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: Browser automation accesses Google NotebookLM: `page.goto(\"https://notebooklm.google.com\", wait"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: Writes state.json (containing all Google session cookies): `context.storage_state(path=str(self.st"
    }
  ],
  "verification": {
    "method": "第一遍：只读通读全仓 21 个文件（SKILL.md、10 个 scripts、3 份 references、requirements.txt、AUTHENTICATION.md、README、CHANGELOG、.gitignore、LICENSE），逐条按 file+line+逐字 quote 取证；脚本以行级阅读为主，重点看输入取自何处、写到哪里、连到哪里。第二遍独立复核（换角度找茬）：①重跑关键 grep 核对行号与原文（return answer + FOLLOW_UP_REMINDER、add_cookies、storage_state、selectors、依赖 pin）；②安全检查改从『找反例』出发：独立扫 dotenv/environ/token/keychain/requests/urllib/socket/screenshot/rmtree，确认无被漏掉的凭证读取或隐藏外发；③核对浏览器启动参数取舍与 sandbox 设置；④逐条对照文档宣称与实现差异（citation、.env、chrome/chromium、数据路径）；⑤核对 pin（.git/packed-refs 与 .git/HEAD）。",
    "second_pass": [
      {
        "item": "skill.path = '.'（根级 SKILL.md）",
        "status": "ok",
        "detail": "重读 SKILL.md L1-4 确认 frontmatter 位于仓库根文件；glob 根 *.json 无命中（无 plugin.json / marketplace.json），故技能入口就是仓库根。"
      },
      {
        "item": "official_desc 逐字",
        "status": "ok",
        "detail": "重读 SKILL.md L2-4：name: notebooklm、description 为单行完整句，与 README L15 的同一句（README 用连字符 'Drastically reduced hallucinations - answers only from your uploaded documents.'）措辞略异，已按 frontmatter 原文收录。"
      },
      {
        "item": "混合认证机制（persistent profile + state.json 注入）",
        "status": "ok",
        "detail": "重读 browser_utils.py（launch_persistent_context 与 `context.add_cookies(state['cookies'])`）与 auth_manager.py（`context.storage_state(path=str(self.state_file))`），行号与首遍一致；AUTHENTICATION.md 的说明标注的脚本行号与实码相差数行（文档漂移），机制描述本身正确。"
      },
      {
        "item": "安全结论：反检测与沙箱关闭",
        "status": "ok",
        "detail": "重读 config.py 的 BROWSER_ARGS 列表：`'--disable-blink-features=AutomationControlled',  # Patches navigator.webdriver` 与 `'--no-sandbox',` 逐字确认；重读 requirements.txt 首段注释确认 'anti-detection' 表述与 patchright pin。三条红色判据均在源码可定位。"
      },
      {
        "item": "安全结论：凭证读取范围",
        "status": "ok",
        "detail": "独立重扫 os.environ|getenv|API_KEY|token|keychain|.env|ssh|credentials：scripts 下零命中（唯二 token 字样在 requirements.txt 与文档中的 python-dotenv）。凭证只有 state.json 里的 Google cookie，路径由 config.py 常量推导，无 ~/.claude 硬编码。"
      },
      {
        "item": "安全结论：网络外发范围",
        "status": "ok",
        "detail": "重扫 requests|urllib|socket|http.client 于 scripts：零命中；网络只经浏览器（notebooklm.google.com / accounts.google.com）、pip（PyPI）与 patchright 下载 Chrome（域名不可定位，已记入 unlocated）。"
      },
      {
        "item": "安全结论：写盘与删除边界",
        "status": "ok",
        "detail": "重读 auth_manager、notebook_manager、cleanup_manager、__init__ 的写路径：state.json / auth_info.json / library.json / .venv，全部位于 <skill>/data 与 <skill>/.venv；删除限定在 data/ 且显式排除 .venv（`Virtual environment (.venv) is never deleted`）。"
      },
      {
        "item": "宣称 vs 实际：citation-backed",
        "status": "discrepancy",
        "detail": "脚本内无任何 citation/来源条目的解析代码，唯一取数路径是响应容器最后一元素的 inner_text；README L65 与 SKILL.md 的 citation 表述实际描述的是 NotebookLM/Gemini 侧行为，本 skill 只做纯文本透传，不能保证引用随答案回到模型上下文。"
      },
      {
        "item": "宣称 vs 实际：.env 配置与 python-dotenv",
        "status": "discrepancy",
        "detail": "requirements.txt 声明 python-dotenv==1.0.0，SKILL.md 与 references/api_reference.md 文档化 HEADLESS/SHOW_BROWSER/STEALTH_ENABLED/TYPING_WPM_MIN/TYPING_WPM_MAX/DEFAULT_NOTEBOOK_ID 等变量，但 scripts 下 grep dotenv|load_dotenv|environ 零命中——这些配置不会生效，依赖为死依赖。"
      },
      {
        "item": "宣称 vs 实际：Chrome 还是 Chromium",
        "status": "discrepancy",
        "detail": "setup_environment.py 装 chrome，而 scripts/__init__.py 装 chromium，SKILL.md 正文也用 chromium 表述；运行期参数 channel=\"chrome\" 与前者一致，说明 __init__ 的 chromium 分支是异类，同仓两条安装路径不一致。"
      },
      {
        "item": "宣称 vs 实际：数据目录位置",
        "status": "discrepancy",
        "detail": "SKILL.md 写 `~/.claude/skills/notebooklm/data/`，而 config.py 用 Path(__file__).parent.parent / 'data' 相对推导（notebook_manager.py 独立重复同一推导）——只有仓库恰好安装在该目录时两者等价；文档给出的绝对路径在其它安装位置不成立。"
      },
      {
        "item": "死代码与失效引用",
        "status": "ok",
        "detail": "重扫 browser_session.py 的引用：全仓无 import（仅自身文件头与 __main__ 提示），且其调用 StealthUtils.random_mouse_movement 在 browser_utils.py 中不存在（该类只有 random_delay/human_type/realistic_click），一旦被调用即 AttributeError；run.py 帮助文本列出的 session_manager.py 亦不存在。"
      },
      {
        "item": "维护状态与 pin",
        "status": "ok",
        "detail": "重读 README 顶部：`> **This project is no longer maintained.** As of September 2026 the repository is archived: no updates, bug fixes or support.`；重读 .git/packed-refs 与 .git/HEAD，pin = c80722d3f27d65e06b6579add201bf69b99101d0，与任务书一致。"
      }
    ],
    "level": 2,
    "level_label": "V2 已复核",
    "commit": "c80722d3f27d65e06b6579add201bf69b99101d0",
    "sha256": "edda31a0efaa9b1c81817feab08cd2cc382997b1c5ca899101b6e351bbf29017",
    "reviewed_by": "skills-bayx-audit",
    "reviewed_at": "2026-10-25"
  },
  "assessed_at": "2026-10-25",
  "method_version": "2.0",
  "mirror": {
    "archive": "https://skillpub.pages.dev/r2/v/2026-09-15/notebooklm-skill.tar.gz",
    "sha256": "edda31a0efaa9b1c81817feab08cd2cc382997b1c5ca899101b6e351bbf29017",
    "commit": "c80722d3f27d65e06b6579add201bf69b99101d0"
  },
  "original": {
    "github": "https://github.com/PleasePrompto/notebooklm-skill",
    "path": "",
    "commit": "c80722d3f27d65e06b6579add201bf69b99101d0"
  }
}