{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "ima-copilot",
  "built": "2026-10-26",
  "control_level": 4,
  "control_level_label": "L4 高权限",
  "capabilities": [
    "execute_command",
    "network",
    "write_file"
  ],
  "required_controls": {
    "agent": [
      "sandbox_recommended",
      "graded_authorization"
    ],
    "admin": [
      "approval_process",
      "rollback_support",
      "full_audit"
    ]
  },
  "evidence": [
    {
      "file": "scripts/",
      "summary": "Executes local script or command: bash scripts/install_ima_skill.sh: curl downloads official zip → unpacks via unzip into /tmp/ima-copilo"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: https://app-dl.ima.qq.com/skills/ima-skills-<version>.zip (curl downloads official distribution package; only validates "
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: /tmp/ima-copilot-staging/<ts>-<pid>/ (downloaded zip and extracted content; installer's cleanup() handled by "
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 换角度找茬：① glob 全量文件清单（含隐藏文件、忽略 gitignore 过滤）核对资产面 = 8 个文件（SKILL.md + 4 references + 3 scripts + 1 config 模板），无 .skill 打包体、无隐藏脚本、无 vendor 进来的上游内容；② 全目录混淆/动态执行 token 扫描（base64 / eval( / exec( / os.system / subprocess / sh -c / xxd / openssl / secret / password）除正常的 api_key 读取外零命中；③ 逐条回查 external_deps 调用点是否真实存在（curl/unzip/npx/node≥18/python3/sed 均在源码定位到原文，两个 IMA 端点与 app-dl 下载端点在脚本常量与文档各有一处以上）；④ 独立实读 npm registry 确认 npx 依赖的真实身份（GET registry.npmjs.org/skills/latest → name=skills、version=1.5.26、repository=git+https://github.com/vercel-labs/skills.git），排除对 `skills` 包名的推测；⑤ SKILL.md 声明 vs 脚本实际行为逐条对表（抓出 3 处表述出入，见确认表 discrepancy 项）；⑥ 三个脚本全文复读确认无写入/无 eval，diagnose.sh 的『严格只读』声明成立；⑦ 对站外 API 行为断言（100 截断、220030）如实标 unlocatable 而不硬写。",
    "second_pass": [
      {
        "item": "外部依赖调用点存在性（curl / unzip / npx / node 版本 / python3 / sed）",
        "status": "ok",
        "detail": "install_ima_skill.sh 对 curl/unzip/npx 做 `command -v` 前置检查、对 node 校验 `-lt 18`、用 `unzip -q -o` 解包、用 `npx -y skills add \"$SKILL_SRC\" -g -y ...` 分发；diagnose.sh 用 python3 打 realpath；known_issues.md 用 `command sed -i.bak`。逐条在源码内命中，无凭空依赖。"
      },
      {
        "item": "npx 运行时依赖的真实身份与版本策略",
        "status": "ok",
        "detail": "实测 GET https://registry.npmjs.org/skills/latest 返回 name=skills、version=1.5.26、repository=git+https://github.com/vercel-labs/skills.git、description='The open agent skills ecosystem'，与脚本 `npx -y skills add` 及文档 [vercel-labs/skills] 指向一致；未 pin 版本，每次按需现拉。"
      },
      {
        "item": "SKILL.md 示例诊断输出 vs diagnose.sh 实际输出",
        "status": "discrepancy",
        "detail": "SKILL.md 示例写 `✅ upstream ima-skill installed (claude-code)`、`❌ upstream ima-skill NOT installed (openclaw)`；脚本实际打印 `✅ ima-skill installed (claude-code) at $CLAUDE_PATH`（带路径、无 upstream 前缀）与 `⚠️  ima-skill NOT installed (openclaw) — run install_ima_skill.sh`（warn 而非 fail，退出码经汇总后仍为 1）。示例仅示意，功能无差异，但照字面比对会对不上。"
      },
      {
        "item": "备份路径描述 vs known_issues.md 实际命令",
        "status": "discrepancy",
        "detail": "SKILL.md 说修复会把原文件拷到 `/tmp/ima-copilot-backups/<timestamp>/<relative-path>`；实际命令是 `BACKUP=\"/tmp/ima-copilot-backups/$(date +%Y%m%d-%H%M%S)\"` 后以扁平重命名保存（`$BACKUP/notes-SKILL.md`、`$BACKUP/knowledge-base-SKILL.md`），并不保留相对目录结构；回滚命令与之一致，功能成立但文档描述不准。"
      },
      {
        "item": "『未探测到 agent 就跳过、不写用户未选择的路径』的表述",
        "status": "discrepancy",
        "detail": "SKILL.md 与 installation_flow.md 都强调未探测到的 agent 静默跳过；但脚本在『零 agent 探测到』时的实际兜底是 `echo \"  Defaulting to claude-code as the most common case.\"` 并继续安装到 claude-code。SKILL.md 的概述未点明这条例外（references 里写了），属概括与实现的轻微出入。"
      },
      {
        "item": "diagnose.sh『严格只读』声明复核",
        "status": "ok",
        "detail": "全文复读：输出只用 echo/printf，读取只用 head -n 1、[ -f ] 探测、tr -d、curl 一次 POST 读响应、python3 打印 realpath；无 > 重定向、无 sed -i、无 chmod、无 rm、无 mkdir。修正结论：『never modify, create, or delete any file』成立。"
      },
      {
        "item": "凭证读取点与去向（是否外发第三方）",
        "status": "ok",
        "detail": "只有 diagnose.sh 与 search_fanout.py 读 env/文件；请求头统一 ima-openapi-clientid / ima-openapi-apikey，目标域名仅 ima.qq.com。全目录 URL 扫描命中集合 = ima.qq.com（含 /openapi 与 /agent-interface）、app-dl.ima.qq.com、github.com/vercel-labs/skills（文档引用）+ npm registry（npx 隐式）；无第三方回调、无埋点、无硬编码密钥常量。"
      },
      {
        "item": "站外 API 行为断言的可验证性（100 截断 / 220030 无权限 / 无跨库端点）",
        "status": "unlocatable",
        "detail": "『恰好 100 条即静默截断且无 is_end/next_cursor』『订阅型 KB 返回 code 220030』『无跨库端点』均为 IMA OpenAPI 的站外行为断言，仓库内无测试/fixture 可证；只能确认实现与断言自洽（HARD_HIT_CAP = 100、PERMISSION_DENIED_MARKER = \"220030\"、truncated 判定式）。要坐实需真实凭证实测，本侦查不硬写。"
      },
      {
        "item": "资产面完整性与是否 vendor 上游",
        "status": "ok",
        "detail": "glob（hidden=True, gitignore=False）结果：ima-copilot/ 下恰好 SKILL.md + scripts/{install_ima_skill.sh,diagnose.sh,search_fanout.py} + references/{installation_flow,api_key_setup,known_issues,search_best_practices}.md + config-template/copilot.json.example；与 SKILL.md 的 File layout 树完全一致，无多余或隐藏文件，目录内不存在任何 ima-skill 上游文件。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247",
    "sha256": "9677c96e7b3f34a4ebda38b473a5f0d793b9bc904e711e9bddbcd55872a77ec5",
    "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/ima-copilot.tar.gz",
    "sha256": "9677c96e7b3f34a4ebda38b473a5f0d793b9bc904e711e9bddbcd55872a77ec5",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247"
  },
  "original": {
    "github": "https://github.com/daymade/claude-code-skills/tree/main/ima-copilot",
    "path": "ima-copilot",
    "commit": "d5c4678cb5d4fd6acc9c922690df035dbd33d247"
  }
}