{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "claude-ads",
  "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: install.sh creates a private venv and executes pip install inside it (--require-hashes --only-binary=:all:)"
    },
    {
      "file": "scripts/ 或 SKILL.md",
      "summary": "Declares dynamic installation of external language package dependencies"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: git clone https://github.com/AgriciDaniel/claude-ads (--source=git / auto); etc."
    },
    {
      "file": "本地工作目录",
      "summary": "File I/O and artifact generation: installation writes to host skill and agent directories (Claude targets are ~/.claude/skills and ~/.claude/agents), copying files individually and logging them into manifest"
    }
  ],
  "verification": {
    "method": "第一遍：只读通读仓库主干（ads/SKILL.md 全文、33 个子技能清单、agents/ 25 个 md 的 frontmatter 与约束句、claude_ads_core 全部模块、scripts/ 14 个 py 的关键函数、install.sh/uninstall.sh、control-plane/manifests、evals 与 tests 抽样），逐条按 file+line+逐字 quote 取证。第二遍独立复核（换角度找茬）：①对每一条 external_deps 重开文件核对行号与调用点（Stability/OpenAI/Replicate/Gemini/GitHub/gh/git/mmdc/WeasyPrint/playwright）；②对 security 四类做独立扫描与反例搜索（sudo/chmod/curl 下载、.claude 读取、keychain、token 文件、写路径逃逸）；③重读 scoring.py 与 control_registry.py，验证『引擎存在但配置全 disabled』这一关键反差；④重读 agents/audit-*.md 确认 worker 真的只读；⑤对照 README/CHANGELOG 宣称与 manifest/代码实际能力；⑥复核 pin。",
    "second_pass": [
      {
        "item": "skill.path = ads（而非仓库根）",
        "status": "ok",
        "detail": "重读 ads/SKILL.md 首 4 行得 name: ads 与产品级 description；重读 AGENTS.md 得『the product entrypoint』；重读 .claude-plugin/plugin.json 确认 skills 字段同时列出 ./ads/ 与 ./skills/。根目录无 SKILL.md，故取 ads。"
      },
      {
        "item": "official_desc 逐字",
        "status": "ok",
        "detail": "重读 ads/SKILL.md 的 frontmatter：description 为带引号的单行长文本，逐字转录无拼接误差。"
      },
      {
        "item": "子技能数量（简报记 34 个 skills/ads-*/SKILL.md）",
        "status": "discrepancy",
        "detail": "两次独立枚举（grep ^name: 与 glob skills/*/SKILL.md）均得 33 个 n8n… 即 ads-* 子技能目录；install.sh 里的 SUB_SKILL_COUNT 是运行时 find 统计、不构成反驳。结论：ads-* 子技能 33 个，加入口 ads 共 34 个 SKILL.md。"
      },
      {
        "item": "external_deps：git clone 与 pip/PyPI",
        "status": "ok",
        "detail": "重开 install.sh 的 clone 段与 venv 安装段：REPO_URL 指向 github.com/AgriciDaniel/claude-ads，注释确认不把凭证嵌进 URL；--require-hashes --only-binary=:all: 与 requirements.lock 逐字存在；verify_managed_install.py 要求收据 resolver 等于 pip / PyPI。"
      },
      {
        "item": "external_deps：Stability / OpenAI / Replicate 端点",
        "status": "ok",
        "detail": "重开 generate_image.py 的 key_map 与三个 provider 分支：1120 行 Stability URL、1122 行 Bearer 头、OpenAI 客户端构造、`import replicate` 均在位；key 名与 key_map 一字不差。"
      },
      {
        "item": "external_deps：Gemini 具体 API 主机名",
        "status": "unlocatable",
        "detail": "仅有弱证据：docstring、key_map 的 GOOGLE_API_KEY 与 generate_gemini 函数定义；函数体内的请求由 google-genai SDK 内部构造，未读到真实 endpoint，故 endpoint 字段只填密钥控制台地址并加注，不编造域名。"
      },
      {
        "item": "external_deps：GitHub API 与 gh 两条独立路径",
        "status": "ok",
        "detail": "重开 audit_ecosystem_live.py 的 Request 构造与 urlopen，以及 release.py 的 subprocess 调 gh api；两处行号与原文复核一致。"
      },
      {
        "item": "security：安装/卸载执行链与提权",
        "status": "ok",
        "detail": "重开 install.sh 的安装段与 uninstall.sh 的删除段，并检索 sudo/chmod/curl：install.sh 无 sudo、无 chmod，无 curl 下载，且测试用断言固定该约束；卸载仅按 manifest 且要求 manifest 存在。"
      },
      {
        "item": "security：egress 与 SSRF 守卫是否真实",
        "status": "ok",
        "detail": "重开 url_utils.py 的解析校验段与 install_playwright_ssrf_guard 的回调：is_global/is_multicast/is_reserved 拦截、本地主机名集合、context.route + abort、attestation 校验均在位；capture_screenshot.py 另有重定向后二次校验。"
      },
      {
        "item": "security：凭证读取清单",
        "status": "ok",
        "detail": "重开 generate_image.py 的 key_map 与参数解析、url_utils.py 的根目录变量、audit_ecosystem_live.py 的 GITHUB_TOKEN、release.py 的信任根变量，并补做全仓 .claude/ 检索：仅命中安装目录常量与禁止性文字，未发现 keychain 或 token 文件读取。"
      },
      {
        "item": "关键反差：引擎存在但默认不可用",
        "status": "ok",
        "detail": "重开 scoring.py（权重、覆盖率、超时无）、control_registry.py 的 enabled 门槛与 scoring-profiles.json：12 个 profile 全 disabled、category_weights 为空；capability-manifest 中每平台 account-mutation 与 account-health-scoring 均 disabled。故『能自动改账户/出健康分』在 pin 版本不成立。"
      },
      {
        "item": "worker 是否真的只读",
        "status": "ok",
        "detail": "重开 agents/audit-google.md 的 frontmatter 与正文，并枚举 agents/ 全部 25 个 md：audit-* 均为 tools: Read, Glob, Grep +『Do not write files or calculate the final platform or portfolio score.』。"
      },
      {
        "item": "宣称 vs 实际：命令面与可执行能力",
        "status": "discrepancy",
        "detail": "README 的命令表与 ads/SKILL.md 的路由表命令集合一致，且每个命令都能在 skills/ 下找到同名目录；但 launch/optimize 的 apply 分支因缺写适配器不可达——README 把 /ads launch 与 /ads optimize 列为可用命令，实际只能产出草稿。CHANGELOG 1.4.0 描述的 banana-claude/MCP 集成（gemini_generate_image、~/.banana/costs.json 等）在现网代码零命中，installer 测试甚至断言不含该字样。"
      },
      {
        "item": "hooks 与 MCP 配置是否存在",
        "status": "unlocatable",
        "detail": "两遍独立检索（grep hooks|settings.json 与 glob **/*hook*、**/.mcp.json、**/mcp*.json）均零命中；.claude-plugin 只有 marketplace.json 与 plugin.json；install.sh 的拷贝清单里没有任何 hook。结论：不注册 hooks、不随包 MCP 配置，MCP 仅作为外部发现项在 references 中讨论。"
      },
      {
        "item": "pin 与许可证",
        "status": "ok",
        "detail": "工作副本 HEAD = ac21644933910419529bcf81efb95a9ca71edf81，与任务书 pin ac2164493391 一致；LICENSE 为 MIT（Copyright (c) 2026 agricidaniel）。版本号：插件侧 2.0.2 与 Python 包侧 2.0.0 不一致，属仓库事实差异。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "ac21644933910419529bcf81efb95a9ca71edf81",
    "sha256": "45274c8104e3a1b665f38a4ace4a1da2b8bf68ea4fa0223868949083c8abaff5",
    "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-ads.tar.gz",
    "sha256": "45274c8104e3a1b665f38a4ace4a1da2b8bf68ea4fa0223868949083c8abaff5",
    "commit": "ac21644933910419529bcf81efb95a9ca71edf81"
  },
  "original": {
    "github": "https://github.com/AgriciDaniel/claude-ads/tree/main/ads",
    "path": "ads",
    "commit": "ac21644933910419529bcf81efb95a9ca71edf81"
  }
}