{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "tapestry-sources",
  "built": "2026-10-26",
  "control_level": 4,
  "control_level_label": "L4 高权限",
  "capabilities": [
    "execute_command",
    "install_deps",
    "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: yt-dlp --list-subs / --write-sub / --write-auto-sub --skip-download --sub-l"
    },
    {
      "file": "scripts/ 或 SKILL.md",
      "summary": "Declares dynamic installation of external language package dependencies"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: YouTube (yt-dlp: subtitles, metadata, audio when necessary; youtube.com / youtu.be / /shorts/)"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: Current working directory: <title>.txt (cleaned main text/transcript, final artifact)"
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 反查（换角度抓第一遍的错）：① 先解决『tapestry-sources 目录不存在』：git ls-tree -r HEAD 全量列名，确认仓库只有 10 个文件/7 个 skill 目录，无 sources 命名；再回 pool.json 看该条目 path 为空（repo 级 AI 摘要『Download sources from articles, PDFs, and YouTube video transcripts』），据此把报告映射到唯一覆盖该描述三源的 learn-this，并同时取证其调用的 article-extractor / youtube-transcript；② 对 learn-this 与两个下游 SKILL.md 做 URL/CLI/写文件关键词扫描，逐条落点（yt-dlp/reader/trafilatura/curl/pdftotext/whisper/python3/apt/brew/npm/pip/rm/mv）；③ 反查『有没有偷偷读凭证』：全仓（含 install.sh、README）无 .env、无 API key、无 token 读取，Whisper 亦为本地模型——坐实 credential_reads 为空；④ 复查降级链是否真存在（reader→trafilatura→curl、手动→自动→Whisper、pdftotext 有/无）逐段落核对；⑤ 复核 install.sh 的写盘范围（仅 $HOME/.claude/skills，覆盖前询问）；⑥ 元数据核对 gh api（543★ / MIT / pushed_at 2026-03-11T22:36:51Z）与本地 HEAD 80e1dc5 一致。",
    "second_pass": [
      {
        "item": "任务表 name_slug=tapestry-sources 对应的 skill 目录",
        "status": "unlocatable",
        "detail": "git ls-tree -r HEAD 列名：LICENSE、README.md、article-extractor/SKILL.md、install.sh、learn-this/SKILL.md、scrum-sage/SKILL.md、session-log/SKILL.md、ship-learn-next/SKILL.md、unblock-action/SKILL.md、youtube-transcript/SKILL.md——无 tapestry-sources 或任何 sources 命名的目录/SKILL.md；pool.json 侧该条目 path=\"{空}\"、来源为 awesome-skills.com 的 repo 级摘要。按任务书规则记为 unlocatable，不硬造目录。"
      },
      {
        "item": "映射决定：以 learn-this 作为本条目主体",
        "status": "discrepancy",
        "detail": "站点摘要『Download sources from articles, PDFs, and YouTube video transcripts』与 learn-this frontmatter description 的三源检测（'Automatically detects content type (YouTube video, article, PDF)'）逐项对应，仓库内没有第二个覆盖三源的入口（article-extractor 只做文章、youtube-transcript 只做视频）。故 skill.path 记为 learn-this，报告显式说明这是映射而非同名命中；如需严格一一对应，本条目应在站点侧标注为 repo 级条目。"
      },
      {
        "item": "文章三级降级链真实存在",
        "status": "ok",
        "detail": "article-extractor/SKILL.md '## Extraction Methods' 依次 Method 1 reader、Method 2 trafilatura、Method 3 兜底 curl + 内联 HTMLParser；'## Complete Workflow' 用 if command -v reader / elif command -v trafilatura / else 分支实现，与 learn-this Step 2 的 case 一致。"
      },
      {
        "item": "YouTube 三段策略与确认门",
        "status": "ok",
        "detail": "youtube-transcript/SKILL.md 明列 Option 1 --write-sub、Option 2 --write-auto-sub、Option 3 Whisper（'**ONLY use this if both manual and auto-generated subtitles are unavailable.**'），且 Whisper 前有体积展示+等待确认、安装前再次等待确认、转写后询问是否删除音频——确认门原文均在。"
      },
      {
        "item": "PDF 分支的 pdftotext 与降级",
        "status": "ok",
        "detail": "learn-this Step 2 PDF 段：curl -L 下载 → if command -v pdftotext → pdftotext 取文并可选删 PDF；否则打印 'pdftotext not found' 与 brew/apt 安装提示并保留 PDF 作为产物。"
      },
      {
        "item": "无凭证读取（重要：决定档位）",
        "status": "ok",
        "detail": "对 learn-this/article-extractor/youtube-transcript/install.sh/README 扫描 .env|API_KEY|token|secret|cookie|login 无命中；yt-dlp 未使用 --cookies-from-browser，Whisper 为本地模型，无任何账号依赖。故 credential_reads 为空、档位落黄而非橙。"
      },
      {
        "item": "文件名清洗与写盘范围",
        "status": "ok",
        "detail": "清洗链在 learn-this（article 行）与 article-extractor（tr '/' '-' / tr ':' '-' / cut -c 1-80|100）均存在；产物写当前目录，中间文件 rm；install.sh 只写 $HOME/.claude/skills（SOURCE 目录为脚本自身所在目录）。"
      },
      {
        "item": "安装命令是否需要提权",
        "status": "ok",
        "detail": "youtube-transcript/SKILL.md 的 Linux 路径为 'sudo apt update && sudo apt install -y yt-dlp'（需要 sudo）；macOS/pip/npm 路径无需提权。已如实写入 scripts_executed 与 external_deps。"
      },
      {
        "item": "外部依赖清单完整性",
        "status": "ok",
        "detail": "三份 SKILL.md 内出现的可执行依赖仅 yt-dlp、whisper、reader、trafilatura、curl、pdftotext、python3 与包管理器；网络出口仅 YouTube、用户 URL、包管理器源；无遥测、无自建端点、无第三方 SDK。"
      },
      {
        "item": "license/stars/commit 元数据",
        "status": "ok",
        "detail": "gh api repos/michalparkola/tapestry-skills：MIT、543★、pushed_at=2026-03-11T22:36:51Z、archived=false；本地 HEAD=80e1dc56df74d1cb849ad649c7ead9756e7929bb（本地为单 commit 浅镜像），与任务书 pin 80e1dc56df74 一致。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "80e1dc56df74d1cb849ad649c7ead9756e7929bb",
    "sha256": "1da7c419a2dedca571bd8a36c5abf331406c393b43ebb1a1958e417fdf12406e",
    "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/tapestry-sources.tar.gz",
    "sha256": "1da7c419a2dedca571bd8a36c5abf331406c393b43ebb1a1958e417fdf12406e",
    "commit": "80e1dc56df74d1cb849ad649c7ead9756e7929bb"
  },
  "original": {
    "github": "https://github.com/michalparkola/tapestry-skills/tree/main/learn-this",
    "path": "learn-this",
    "commit": "80e1dc56df74d1cb849ad649c7ead9756e7929bb"
  }
}