{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "youtube-intro-outro",
  "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": "Local script or command execution: (Verification loop explicitly specified in SKILL.md) `npx remotion still Intro out/i-{windup,impact,settle}.pn"
    },
    {
      "file": "网络端点",
      "summary": "External network access declaration: `npx remotion …`: first execution fetches packages and CLI via official npm channels (registry.npmjs.org, domain handled by npm, not hardcoded in source)"
    },
    {
      "file": "本地工作目录",
      "summary": "File I/O and artifact generation: Remotion projects built by agent per this skill and out/intro.mp4, out/outro.mp4 (batch outputs to out/<brand>"
    }
  ],
  "verification": {
    "method": "第二遍独立重读（只读 pin commit f3df381d65abe5078f5ed410bbc3ed72e7cb92bd）：① 目录清单 `find skills/youtube-intro-outro -type f` 返回 SKILL.md、references/intro-outro.md 与 0 字节 README.md；② 逐行打开 intro-outro.md，核对 SKILL.md 的每条主张是否在实现/表里落地——平台时间常数表、logo sting 完整组件、CSS/GSAP 变体、瞬态找帧四步法、16:9 端屏 ASCII 坐标图与元素尺寸表、Shorts 例外、可开关 guides 的 plate、brand schema 与批量循环，逐项可定位；③ 把 SKILL.md 的两张表（打击节拍表、元素尺寸表）与 reference 逐值比对；④ 对全目录 grep `process.env|api[_-]?key|token|cookie|https?://|youtube.com|googleapis` 确认 0 命中（本 skill 不接平台 API）；⑤ 回读仓库根 scripts/{contact-sheet.sh,probe-mp4.sh} 确认只调 ffmpeg/ffprobe；⑥ 专项比对「Shorts 场景」在 SKILL.md 与 reference 的覆盖差异。",
    "second_pass": [
      {
        "item": "平台时间常数在 SKILL.md 与 reference 是否一致（防一手数据两处不同）",
        "status": "ok",
        "detail": "SKILL.md：intro 3-5s、logo hit 1-2s、end-screen 只允许最后 5-20s、视频 ≥25s、outro plate 保持 ~20s；reference 表：\"logo hit 1-2s\"、\"Whole intro | 3-5s max\"、\"End-screen window | last 5-20s\"、\"Outro plate hold | ~20s\"、\"Minimum total video length | 25s\"。两处逐值对应，无矛盾。"
      },
      {
        "item": "元素尺寸与数量上限是否两处一致",
        "status": "ok",
        "detail": "SKILL.md 给 Subscribe/channel circle 294×294、Next-video card 615×345、Playlist/link card 294×294，并在输出清单写「Up to 4 end-screen elements planned (1 video + 1 subscribe is the highest-CTR layout)」；reference 元素表同值（615×345 / 294×294 / 294×294）并写 \"| Max elements | 4 | highest CTR layout = **1 video card + subscribe**, nothing else |\"。一致。"
      },
      {
        "item": "Shorts（9:16）场景的覆盖是否存在缺口（第一遍只读 SKILL.md 会漏）",
        "status": "discrepancy",
        "detail": "SKILL.md 的硬规则 2 是无条件表述：「The outro must be ≥20s of held, quiet layout, and the video ≥25s total.」并未提 Shorts 例外；而 reference §1 明确写 \"for Shorts use a 2-3s end card and a verbal CTA instead of native end-screen elements (Shorts do not support them)\"，§5 另设「9:16 (Shorts) note」。结论：只读 SKILL.md 的 agent 可能给一条 45 秒的 Short 设计 20 秒 outro，直接吃掉整片——这是对 pin commit 有效的真实覆盖缺口（信息存在于 reference，未上提到 SKILL.md 的硬规则）。"
      },
      {
        "item": "「Anything longer than 5s causes measurable viewer drop-off」是否有据",
        "status": "unlocatable",
        "detail": "SKILL.md 与 reference 都以肯定语气给出留存影响（\"retention drops measurably\"），但仓库内无引用来源、无数据集、无链接；本次为只读侦查，不验证该断言，仅记为文档声明。平台机制部分（5-20s 窗口、≥25s 门槛）属 YouTube 公开规则，可信度高但仍未附官方链接。"
      },
      {
        "item": "brand prop 是否真的无任何硬编码（防「模板化」空口宣称）",
        "status": "ok",
        "detail": "SKILL.md 的 LogoSting 与 EndScreen 组件里，颜色/字体/logo/sting 全部取自 `brand.bg` / `brand.fg` / `brand.accent` / `brand.logo` / `brand.sting`（仅字体族在示例里写 \"700 56px Inter\" 这类样式串）；reference §7 定义 Brand 类型与 brands/pixelforge.json 示例，并强调 \"Keep fonts, sizes, timing, and layout fixed in the components — only `brand.json` changes.\" 与 SKILL.md 的宣称一致。"
      },
      {
        "item": "impact 帧对齐方法是否可操作（而非只喊「要对齐」）",
        "status": "ok",
        "detail": "reference §4 给出四步：「Open the sting in any waveform view… The impact is the tallest transient」「Read its time in seconds, e.g. 0.78s」「Set `IMPACT = Math.round(0.78 * fps)` and make the logo's `opacity`/`scale` snap key fall on that frame.」「If you can't move code, instead trim the audio so its transient sits at your fixed `IMPACT` (e.g. 0.8s)」。方法具体、可执行，且给了代码侧与音频侧两种收敛方向。"
      },
      {
        "item": "验收与交付是否覆盖「guides 不得进成片」",
        "status": "ok",
        "detail": "SKILL.md 写 \"Ship the dashed guides only in a preview build; the final render drops them\"，verify 段亦要求 \"Drop the dashed end-screen guides for the final render; verify the right two-thirds is intentionally quiet.\"；reference §6 用 prop 开关实现同一组件的两种输出。纪律 + 机制 + 验收三处齐备（但仍是纪律而非强制渲染开关）。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "f3df381d65abe5078f5ed410bbc3ed72e7cb92bd",
    "sha256": "9f3a594d22ab469449b5974bf2d09b647a31b0cfa168b75cd4b76e536d7997bc",
    "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/youtube-intro-outro.tar.gz",
    "sha256": "9f3a594d22ab469449b5974bf2d09b647a31b0cfa168b75cd4b76e536d7997bc",
    "commit": "f3df381d65abe5078f5ed410bbc3ed72e7cb92bd"
  },
  "original": {
    "github": "https://github.com/iart-ai/youtube-video-skills/tree/main/skills/youtube-intro-outro",
    "path": "skills/youtube-intro-outro",
    "commit": "f3df381d65abe5078f5ed410bbc3ed72e7cb92bd"
  }
}