{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "changelog-video",
  "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 scripts or commands: `node <SKILL_DIR>/scripts/align-captions.mjs --tokens script-tokens.json --w`"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: HeyGen TTS service (via `heygen` CLI with OAuth authentication; transmits spoken text from `vo-spoken.txt` to retrieve audio + word-level timestamps, consuming credits)"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: project directory `projects/active/weekly-changelog-<range>/`: `index.html`, `ledger.json`, `scrip`"
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 反查（含对资产的实检）：① 全量文件清单：changelog-video/ 下 16 个文件（SKILL.md、scripts/align-captions.mjs、4 个 references、2 个 examples、5 个 woff2 字体、assets/bg-pattern.mp4、assets/bgm.mp3），逐一列 size；② token 扫描（URL / process.env / child_process / fetch / writeFile / KEY|TOKEN|SECRET / aws|heygen|uvx|npx）：URL 命中集中在 master-skeleton 的 jsdelivr GSAP 与 SKILL.md 的端点描述，脚本自身零网络；③ 打开 align-captions.mjs 全文核对（确认只读两 JSON、写 captions.json、导出码语义）；④ 实检 133/132 字节的 mp4/mp3：cat 头部确认为 `version https://git-lfs.github.com/spec/v1`，并读 .gitattributes 的 LFS 规则段与 `git cat-file -s HEAD:…` 交叉验证（blob 133 字节 = 指针）；⑤ 核对 SKILL.md 引用的 Repo-native TTS 路径在 pin 上是否存在（find . -name 'heygen-tts*'）；⑥ 复核 master-skeleton 的背景与 seam-craft 教义的关系；⑦ 用 PyYAML 复采 frontmatter（description 单行 plain scalar，解析与原文一致）。",
    "second_pass": [
      {
        "item": "SKILL.md Step 4 点名的仓库内 TTS 封装路径在 pin 上是否存在（照抄会不会立刻失败）",
        "status": "discrepancy",
        "detail": "不存在。SKILL.md 写 `node skills/hyperframes-media/scripts/heygen-tts.mjs`，并在注释里说明「the changelog-video skill runs from the hyperframes repo root, so it uses the tracked hyperframes-media TTS helper directly」；但 pin 内 skills/ 下没有 hyperframes-media 目录，全仓 heygen-tts* 唯一命中是 `skills/media-use/audio/scripts/heygen-tts.mjs`。同一过期路径还出现在 `.claude/skills/README.md`（TTS uses the tracked …）。结论：Step 4 命令按字面执行会 ENOENT，需改用 media-use 侧脚本（SKILL.md 自己留了 swap in your own path 的余地，故不算虚假声明）。"
      },
      {
        "item": "自带 bg-pattern.mp4 / bgm.mp3 是否真的可用（Step 0 的 cp 与 ffmpeg 是否拿到媒体）",
        "status": "discrepancy",
        "detail": "在未拉 LFS 的检出里是 LFS 指针，不是媒体。实检：assets/bg-pattern.mp4 = 133 字节、assets/bgm.mp3 = 132 字节，内容为 `version https://git-lfs.github.com/spec/v1 / oid sha256:… / size 12817182`（mp4）与 `size 5318438`（mp3）；仓库 .gitattributes 明写 `.claude/skills/**/*.mp4|*.mp3 filter=lfs`；`git cat-file -s HEAD:<path>` 亦返回 133（blob 即指针）。因此 Step 0 的 cp 与 `ffmpeg -i <SKILL_DIR>/assets/bg-pattern.mp4` 在未 git lfs pull / 未装 git-lfs 的环境会失败或产出坏文件（本工作副本的 git 甚至没有 lfs 子命令）。这是 pin 检出相关的真实差异，不是文档错误——但照本文档流程跑的人必须先确保 LFS 已拉取。"
      },
      {
        "item": "「字幕非可选」是否真有连锁校验（是否只是口号）",
        "status": "ok",
        "detail": "三处闭环可查：① 骨架 HTML 里确有读 LINES 的字幕 IIFE（`const LINES = /* paste captions.json lines … */ [];` 与 #cap-line 容器、tl.set/tl.to 逐词淡入）；② SKILL.md Step 5 给出把 captions.json 贴进 IIFE 的具体写法；③ Step 6 第 5 道闸要求跨旁白采样 3-4 帧确认字幕可见，并点名 Jul 13-20 v4 的失败。口号有实现支撑。"
      },
      {
        "item": "align-captions.mjs 的行为是否与 script-voice.md 的描述一致",
        "status": "ok",
        "detail": "脚本注释与实现一致：tokens {lines:[{id,tokens:[str|{display,spoken}]}]} + words [{text,start,end}] → captions.json {lines:[{id,end,w:[[display,start],…]}]}；贪婪 consume 支持「一个 display token 覆盖多个 spoken 词」；用 norm（去非字母数字）+ Levenshtein close 做模糊匹配；有 MISMATCH 计数并 `process.exit(mismatches ? 1 : 0)`。无网络、无子进程，只 readFileSync ×2 + writeFileSync ×1。"
      },
      {
        "item": "check 的 --caption-zone 与 preview 缓存提醒是否自洽（是否存在互相矛盾的验收）",
        "status": "ok",
        "detail": "Step 6 第 1 条用仓库内 CLI 跑 caption-zone（x0=0;y0=.90;x1=1;y1=1;severity=error，26 个 seek 点）拿 0 error；第 3 条要求重启预览服务后再用 __player.seek 抽查——两处不冲突（前者静态闸、后者运行期抽查），且都与 build-spec 的「字幕轨 top:990（=1080×0.9167，落在 .90–1 带内）」一致。"
      },
      {
        "item": "Stage ground 与本 skill 骨架是否一致（跨 skill 一致性）",
        "status": "discrepancy",
        "detail": "seam-craft / cut-the-curve 教义要求把不透明底色刷在 #root（`#root { background: var(--canvas-deep, var(--canvas, #000)) }`）。本 skill 的 master-skeleton.html 实测把底色放在 `html, body { background: #0a0c0b }`，#root 只有 data-* 属性、没有 background 声明；#root 内首个子元素是满幅 bg-video（track0）+ scrim。对本骨架而言白闪仍被 body 底色挡住（body 也是不透明深色），观感风险低；但与教义字面要求的形式不一致，且未用 --canvas-deep/--canvas 变量（该变量在 pin 内零命中）。记录为形式差异，不改档位。"
      },
      {
        "item": "CloudFront invalidation 是否只是可选建议（影响档位判断）",
        "status": "ok",
        "detail": "它写在 Anti-patterns 表的「Don't」列：`Delivered without CloudFront invalidation` → `Run aws cloudfront create-invalidation on distribution E2BSLVSZ7FG3U0 …`。即「交付却不做 invalidation」被定义为反模式，属交付流程的必需步骤而非可选花絮——这是判橙（触碰用户云凭据）的依据。"
      },
      {
        "item": "是否存在被忽略的其他外发（例如字体/CDN 在构建期拉取）",
        "status": "ok",
        "detail": "字体是本地 woff2（5 个文件实检非 LFS 指针，约 488KB），build-spec 明确要求 `local @font-face with format('woff2') embeds at render`；唯一 CDN 引用是 master-skeleton 的 jsdelivr GSAP（产物期，浏览器端）。未发现构建期遥测、上报或未知端点。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "d2f0bc7f34837da54ae22063772d75d75ce26477",
    "sha256": "f474b43e1565756e362afa756b510d0c814d97bca05eae3caeacdd0304170a11",
    "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/changelog-video.tar.gz",
    "sha256": "f474b43e1565756e362afa756b510d0c814d97bca05eae3caeacdd0304170a11",
    "commit": "d2f0bc7f34837da54ae22063772d75d75ce26477"
  },
  "original": {
    "github": "https://github.com/heygen-com/hyperframes/tree/main/.claude/skills/changelog-video",
    "path": ".claude/skills/changelog-video",
    "commit": "d2f0bc7f34837da54ae22063772d75d75ce26477"
  }
}