{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "faceless-explainer",
  "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: node scripts/build-frame.mjs --preset <name> --hyperframes . (step 2 design system, writes frame.md)"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: HeyGen Audio API (TTS voice synthesis and music library search via media-side script/CLI, credentials in ~/.heygen)"
    },
    {
      "file": "本地工作目录",
      "summary": "File I/O and artifact generation: videos/<project>/hyperframes.json, BRIEF.md, capture/extracted/visible-text.txt"
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 反查（换角度抓第一遍的错）：① 全量文件清单（含隐藏）核对：24 个文件 = SKILL.md + 4 篇 references + sub-agents/frame-worker.md + 17 个 .mjs + transitions.json，与 skills-manifest.json 的 files=24 一致，无隐藏文件。② token 扫描（URL / fetch / process.env / child_process / writeFile / API_KEY|TOKEN|SECRET|.env|Bearer / GEMINI）：URL 命中仅 2 处，均为装配脚本里写进产出 HTML 的 gsap CDN（带 SRI）；fetch/http.request/axios 0 命中；GEMINI 0 命中（与 product-launch-video 的 3 处视觉 key 探测形成对照，坐实本 skill 无抓取/无视觉 key）；凭证关键词命中全部是 SKILL.md 里 『tokens.json』的 'tokens' 子串误配与 .env 的使用禁令文本，非读取。③ 逐条打开关键脚本：assemble-index.mjs 确证 spawnSync(ffprobe/ffmpeg) 与 gsap CDN 模板；audio.mjs 头注释确证 'no HeyGen credential ⇒ skip, never a detached generate'。④ 与 product-launch-video 做同族对照，验证『无源变体』声明：两者脚本名重合 6 个（build-frame/audio/captions/transitions/frame-packets/assemble-index），本 skill 独缺 capture 与 stage-assets——第一遍曾误以为本 skill 无 build-frame，已按源码更正（见 second_pass 的 discrepancy 条）。⑤ 功能声明 vs 实际能力：description 的四类用途（topic explainers / concept breakdowns / how-tos / listicles）与 story-design.md 的类型枚举（concept / how-to / listicle / story）一一对应，未见夸大。",
    "second_pass": [
      {
        "item": "『无抓取、无视觉 key』这一关键差异是否属实",
        "status": "ok",
        "detail": "整目录 grep GEMINI/GOOGLE_API_KEY/OpenRouter → 0 命中；SKILL.md 明确 'Do **not** run `npx hyperframes capture` (there is no URL).'；URL 扫描仅 2 处（同一 gsap CDN 字符串出现在 assemble-index.mjs 与 captions.mjs）。差异成立。"
      },
      {
        "item": "是否与 product-launch-video 真正共享脚本（第一遍的资产描述是否正确）",
        "status": "discrepancy",
        "detail": "第一遍初稿把本 skill 写成『无 build-frame』——复核发现**错误**：Step 2 原文就是 `node <SKILL_DIR>/scripts/build-frame.mjs --preset <name> --hyperframes .`，scripts/ 下确有 build-frame.mjs。真实差异是：本 skill 无 capture（Step 1 改为手造输入包）、无 stage-assets（SKILL.md 写明 'There is **no asset-staging step**'），而 build-frame / audio / captions / transitions / frame-packets / assemble-index 六个脚本两家都有。已按源码更正 analysis 与 internal_assets 的表述。"
      },
      {
        "item": "『外部资源』逐条回查调用点",
        "status": "ok",
        "detail": "hyperframes init/lint/check/snapshot/preview/render 均在 SKILL.md 出现；HeyGen 与 ~/.heygen 在 Step 3.1 原文；Kokoro 离线降级与 am_/bm_ 前缀在 Step 3.1 原文；prefs.mjs/recipe.mjs 在 Step 0 原文并定义了 <MEDIA_DIR>；ffprobe/ffmpeg 在 assemble-index.mjs 的 spawnSync 可验。"
      },
      {
        "item": "静音标记的实现语义是否与文档一致",
        "status": "ok",
        "detail": "SKILL.md 规定 `music: none` + 无 SCRIPT.md = 全静音，且『audio.mjs recognizes it and generates nothing (it removes any stale audio_meta.json; an absent audio_meta.json is what assemble treats as silent)』；Step 5 的 sync-durations / fetch-sfx 在静音时跳过。语义自洽（以「文件不存在」作为静音的真值载体）。"
      },
      {
        "item": "正文自述的已知假阳性是否真实存在于工具链",
        "status": "unlocatable",
        "detail": "SKILL.md 声称 `check` 会在 caption 高亮词上报 1–4px 的 text_box_overflow（选择器 `#caption-word-*` / `.caption-line`），且该 pill 的 snug line-height 由 scripts/captions.mjs 设定。caption pill 的 line-height 设定可在本 skill 的 captions.mjs 中定位，但『该假阳性确实会出现』这一行为需要实际跑 `npx hyperframes check` 才能证实——本任务为只读侦查，未执行构建/渲染（亦被任务书禁止）。故记为无法在源码内定位，不做进一步断言。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "b8328f957368713d288900957eb5bee0dca31dd9",
    "sha256": "2b565aaa0ac760620486c18c3cdd85ab28efc669da3b19f58741d1a0783455d9",
    "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/faceless-explainer.tar.gz",
    "sha256": "2b565aaa0ac760620486c18c3cdd85ab28efc669da3b19f58741d1a0783455d9",
    "commit": "b8328f957368713d288900957eb5bee0dca31dd9"
  },
  "original": {
    "github": "https://github.com/heygen-com/hyperframes/tree/main/skills/faceless-explainer",
    "path": "skills/faceless-explainer",
    "commit": "b8328f957368713d288900957eb5bee0dca31dd9"
  }
}