{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "claude-seo",
  "built": "2026-10-26",
  "control_level": 4,
  "control_level_label": "L4 高权限",
  "capabilities": [
    "execute_command",
    "install_deps",
    "network",
    "write_file"
  ],
  "required_controls": {
    "agent": [
      "sandbox_recommended",
      "graded_authorization"
    ],
    "admin": [
      "approval_process",
      "rollback_support",
      "full_audit"
    ]
  },
  "evidence": [
    {
      "file": "scripts/",
      "summary": "Executes local scripts or commands: scripts/claude-seo (bash) → scripts/runtime.py: `run` executes one of 52 allowlisted scripts; `setup` builds runtime"
    },
    {
      "file": "scripts/ 或 SKILL.md",
      "summary": "Declares dynamic installation of external language package dependencies"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: pypi.org (runtime.py `-m pip install -r requirements.txt`, 18 packages)"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: ~/.claude/skills/** (seo and 24 seo-* sub-skills, extension mirror skills), ~/.claude/agents/seo-*"
    }
  ],
  "verification": {
    "method": "两遍独立核对。第一遍按框架读全目录并逐项取证；第二遍换角度重读关键证据并主动证伪：① `git rev-parse HEAD` 复核 pin；② `git ls-tree -r --name-only HEAD` 取全量 408 个文件清单，核对 skills/25 目录、agents/18 文件、extensions/8 扩展、scripts/55 个 .py、hooks/3 文件；③ 每个 external_deps 条目回到源码行确认调用点真实存在（常量定义行 / installer 行 / env 读取行）；④ 反查遗漏的网络与执行面：全仓正则扫描 urlopen/requests./httpx/subprocess/npx/pip/playwright，扫 os.environ 全量键名，扫 ~/.claude.json、~/.claude/settings.json、~/.config/claude-seo 的读写点；⑤ 专做混淆与隐藏脚本扫描（base64 -d、eval(、exec(、\\xNN、curl|bash、irm|iex）零命中；⑥ 用 ast/正则解析 runtime.py 的 ALLOWED_CORE_SCRIPTS 与 scripts/ 实际文件做差集；⑦ 复核描述真实性：清单的「25 sub-skills / 18 sub-agents / 8 optional MCP extensions」与磁盘实数一致，「410 tests」仅取徽章未在本地执行（遵守批 2 不跑测试约束）；⑧ 定位 skill.path 的候选与结论。",
    "second_pass": [
      {
        "item": "skill.path 定位",
        "status": "ok",
        "detail": "候选：仓库根（无 SKILL.md，只有 README/AGENTS/CLAUDE/SECURITY 等治理文件）、skills/seo/（SKILL.md frontmatter `name: seo` + `user-invocable: true`，Quick Reference 表是全插件唯一命令入口，runtime 约定、编排逻辑、评分权重只写在这里）、skills/seo-audit/（只是被路由到的子技能）、extensions/*（需另行安装的可选项）。结论 skills/seo 为该插件旗舰入口目录，与被分配的 path 一致。注意本行 identity 是整个插件，故 analysis 覆盖全仓（8 扩展、18 agent、55 脚本、hook、安装器）而非仅路由文件。"
      },
      {
        "item": "「扩展把 MCP 配置合并进 ~/.claude/settings.json」的说法",
        "status": "discrepancy",
        "detail": "docs/ARCHITECTURE.md:346 写「6. Merges MCP config into `~/.claude/settings.json` non-destructively」，但实际 dataforseo/firecrawl/banana/ahrefs 四个 installer 写的是 `~/.claude.json`，并在注释中明确反驳该文档（「MCP servers live in ~/.claude.json (the file `claude mcp add` writes). NOT ~/.claude/settings.json - `mcpServers` is not a key Claude Code reads there」）。真正写 settings.json 的是 bing-webmaster/profound/seranking（写 env 段，语义正确）。属文档未同步，非行为缺陷。"
      },
      {
        "item": "运行时白名单是否会挡住合法脚本",
        "status": "ok",
        "detail": "正则提取 ALLOWED_CORE_SCRIPTS 得 52 项，与 scripts/ 下 55 个 .py 的差集恰为 release_sign.py、verify_release.py、runtime.py；前两者是发布签名/校验工具，后者是 launcher 目标本身（_resolve_script 显式拒绝 candidate == __file__）。文档中被引用的脚本（render_page/fetch_page/google_auth/backlinks_auth/drift_*/schema_generate/sync_flow 等）全在白名单内，声明与实现相符。"
      },
      {
        "item": "CLAUDE.md 称 scripts/ 有 54 个 Python 执行脚本",
        "status": "discrepancy",
        "detail": "实测 `ls scripts/*.py` = 55（白名单 52 + 3 个发布/运行时）。差一行注释，不影响能力结论，但说明此类计数属陈旧文案，引用须以磁盘为准。"
      },
      {
        "item": "「25 子技能 / 18 子agent」是否夸大",
        "status": "ok",
        "detail": "skills/ 下 25 个目录、agents/ 下 18 个 .md，与 plugin.json「25 sub-skills (21 core + 1 orchestrator + 1 framework + 2 extension mirrors) and 18 sub-agents」精确对应；SKILL.md 正文说「orchestrates 24 sub-skills」并解释第 25 个是 orchestrator 自身，两种表述数学自洽。"
      },
      {
        "item": "「410 tests passing」徽章",
        "status": "ok",
        "detail": "README 徽章声明 410 passing；本地 tests/ 有 90+ 个 test_*.py，且存在安全主题测试（test_url_safety、test_extension_installer_injection、test_agent_untrusted_content、test_banana_api_key_safety、test_google_api_key_safety 等）。按批 2 约束未执行任何测试，故仅作为「测试面存在」的证据，不背书通过数。"
      },
      {
        "item": "是否漏掉网络调用 / 隐藏脚本 / 混淆",
        "status": "ok",
        "detail": "全仓扫描 http(s) 主机与 requests./urlopen/subprocess/npx/pip/playwright 调用点后，未发现未列入 external_deps 的外发目标；base64 -d、eval(、exec(、\\xNN、`curl | bash`、`irm | iex` 全部零命中；install.sh 把 clone 固定在 tag（REPO_TAG=v2.3.1，注释说明防 main 静默漂移），并有 test_manifest_consistency.py 守卫与 plugin.json 一致。"
      },
      {
        "item": "外部依赖逐条回源",
        "status": "ok",
        "detail": "22 条 external_deps 全部由「常量定义行 / installer 写入行 / env 读取行」直接引证，无一条取自 README 宣传语。唯一非源码级的是 Playwright Chromium 的下载域名（runtime.py 只写 `-m playwright install chromium`，域名未出现在仓库），已在该条 endpoint 如实标注。"
      },
      {
        "item": "install.sh 手动安装路径的实证边界",
        "status": "ok",
        "detail": "install.sh 依赖 git，clone 后把 skills/agents/scripts/schema/data/pdf/hooks/extensions 拷进 ~/.claude/，并用 sed 把 `${CLAUDE_PLUGIN_ROOT}` 改写成 `$HOME/.claude/skills/seo/scripts/claude-seo`；对 hooks 只做文件拷贝并自陈 enforcement 需要 plugin install。因此「hook 会执行」仅在插件安装路径成立，未无条件推广到手动安装。"
      },
      {
        "item": "内容不可信政策的覆盖面",
        "status": "ok",
        "detail": "逐份 grep 18 个 agent 文件：14 个含逐字相同的 untrusted-data 条款（其余为扩展镜像/框架 agent）；seo-flow 额外规定 WebFetch 跳转后的最终响应按不可信处理。确认为全仓一致策略而非个别文件，故 injection_surface 表述为「提示层系统化但非强制」，未宣称已验证有效。"
      },
      {
        "item": "pin 与真实 HEAD 一致性",
        "status": "ok",
        "detail": "`git -C /var/ytdown/skills-portal/spy-repos/claude-seo rev-parse HEAD` 输出 92795530b4cc92c6bf7a2435b82c15b003e71181，与任务书 pin 及本文件 skill.commit / audit.skill_commit 逐字一致（只读命令，未动工作副本）。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "92795530b4cc92c6bf7a2435b82c15b003e71181",
    "sha256": "50b15d6fd70df445163ce3994df1916f80c127c4240fd5c3ad48e52873398508",
    "reviewed_by": null,
    "reviewed_at": null
  },
  "assessed_at": "2026-10-25",
  "method_version": "2.0",
  "mirror": {
    "archive": "https://skillpub.pages.dev/r2/v/2026-09-15/claude-seo.tar.gz",
    "sha256": "50b15d6fd70df445163ce3994df1916f80c127c4240fd5c3ad48e52873398508",
    "commit": "92795530b4cc92c6bf7a2435b82c15b003e71181"
  },
  "original": {
    "github": "https://github.com/AgriciDaniel/claude-seo/tree/main/skills/seo",
    "path": "skills/seo",
    "commit": "92795530b4cc92c6bf7a2435b82c15b003e71181"
  }
}