{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "camera-3d-captions",
  "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/prep-take.sh <take> <start> <dur> <assets> (ffmpeg/ffprobe subprocesses;"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: registry.npmjs.org: fetches hyperframes@0.8.62 via npx per execution (pinned version; does not follow latest)"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: inside project assets/: portion.mp4, plate-tall.mp4, person.webm, metrics.js, hand/*.png and "
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 反查（换角度抓第一遍的错）：① 全量文件清单核对（12 个文件：SKILL.md + scripts/{prep-take.sh,font-metrics.py,frame-bounds.js,glyph-gaps.js} + scripts/hand/{build-sprites.py,hand-word.anim.js} + assets/kit/{cam3d.js,tables.js,finish.js} + references/{worked-film.html,recipes.md}）。② token 扫描：URL 全目录仅 1 处命中（worked-film.html 的 gsap CDN）；process.env/os.environ 仅 1 处（build-sprites.py 的 P5_ENGINE）；subprocess 命中 build-sprites.py 与 prep-take.sh；无 fetch/requests/axios/undici。③ 逐条打开脚本核对调用点真实存在（不采信 SKILL.md 的自述）：prep-take.sh 的 ffmpeg/ffprobe/npx 命令、font-metrics.py 的 fontTools 调用、cam3d.js 的 POST=15/K=7、tables.js 的实测数组均在源码内可验。④ 反例检查：专门找有没有漏掉的联网面（结论是没有；抠像为本地推理，画面不上传）。",
    "second_pass": [
      {
        "item": "skill 自身是否读凭据（黄/橙分界的关键）",
        "status": "ok",
        "detail": "全目录 process.env / os.environ 只命中 build-sprites.py 的 P5_ENGINE（p5 引擎目录路径）；无 API key、token、cookie、keychain、.env 读取。因此按范式的橙档第一条不成立，落黄。"
      },
      {
        "item": "「外部资源」逐条回查调用点",
        "status": "ok",
        "detail": "hyperframes@0.8.62 在 SKILL.md 与 prep-take.sh（HF=\"hyperframes@0.8.62\"）两处一致；ffmpeg/ffprobe 在 prep-take.sh 的 ffmpeg/probe() 内可验；fontTools 在 font-metrics.py import 段；GSAP CDN 在 worked-film.html 与 SKILL.md 的 Render time 条；p5 引擎调用在 build-sprites.py 的 subprocess.run(cwd=engine)。"
      },
      {
        "item": "prep 阶段的三者对齐自检是否真会失败退出（不是装饰性文字）",
        "status": "ok",
        "detail": "prep-take.sh 定义 fail(){ echo ... >&2; exit 1; }，并对 plate 尺寸、matte 尺寸、三者的帧率与帧数各写了一条比较分支，任一不符即 exit 1；成功路径打印 'prep-take: plate and matte aligned with the portion ($pn frames @ $pr)'。"
      },
      {
        "item": "手绘风格是否真的复用 p5-paint-animation 引擎，且临时帧会被清理",
        "status": "ok",
        "detail": "build-sprites.py 用 subprocess.run(['node','render-anim.mjs', ...], cwd=engine) 渲染临时 sketch（写在 tempfile 目录，落在自己的 temp 而非引擎内），读引擎 out/_frames_<name>.anim/ 的 PNG 后调用 shutil.rmtree(fdir, ignore_errors=True)；与 SKILL.md『frames are written to that skill's out/ and removed afterwards』一致。"
      },
      {
        "item": "worked-film.html 能否按 SKILL 的 Build 步骤原样打开（参考片的可运行性声明）",
        "status": "discrepancy",
        "detail": "SKILL.md 只说 'its media is not included'，但参考片的 <head>/<body> 还引用了 assets/o2o-data.js（注释写 'window.O2O here = assets/kit/tables.js'）与 assets/Inter-Variable.woff2、assets/InterTight-900.woff2 等字体文件；o2o-data.js 与这两个 woff2 均不在包内（全量清单已确认）。按 SKILL 的『Copy assets/kit/{cam3d.js,tables.js,finish.js} and metrics.js into the project's assets/』操作仍缺 o2o-data.js，参考片不能原样运行——读者须自行把 tables.js 改名/桥接成 window.O2O 并自带字体。该出入对 pin commit 有效。"
      },
      {
        "item": "15 fps 网格与 0.2 s 提前量是否真在实现里（而不是只写在文档）",
        "status": "ok",
        "detail": "cam3d.js 顶部 var W = 1440, H = 1080, CX = 720, CY = 540, FPS = 30, POST = 15, K = 7;，并有 post(t) = Math.floor(t * POST + 1e-4) / POST；SKILL.md 给出 fr(t) = 2·round((t − 0.2)·15)（×2 即 30 fps 渲染下的 15 fps 映射），两处自洽。"
      },
      {
        "item": "『带 grade 与多重影渲染约 2× 成本』的量化声明",
        "status": "unlocatable",
        "detail": "SKILL.md 的 Limits 段写 'Rendering with the grade and many ghost layers costs about 2× a plain render.'，包内没有基准脚本或计时数据可复现该倍数；本次为只读侦查且不得运行渲染，故仅作为文档声明记录，不作为已核事实使用。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "ba7a0bb6d3567d124c51f6074625043bfe0b32eb",
    "sha256": "70cf48e51fa89f4e5b8f9630668fe5bc5e78d8493cdf9f787453df8915a19b53",
    "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-28/camera-3d-captions.tar.gz",
    "sha256": "70cf48e51fa89f4e5b8f9630668fe5bc5e78d8493cdf9f787453df8915a19b53",
    "commit": "ba7a0bb6d3567d124c51f6074625043bfe0b32eb"
  },
  "original": {
    "github": "https://github.com/heygen-com/hyperframes-community-skills/tree/main/skills/camera-3d-captions",
    "path": "skills/camera-3d-captions",
    "commit": "ba7a0bb6d3567d124c51f6074625043bfe0b32eb"
  }
}