{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "guizang-ppt",
  "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: scripts/validate-swiss-deck.mjs — explicitly called by user/agent (`node .../validate-swiss-d"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: Step 0 self-update check: git fetch upstream (github.com/op7418/guizang-ppt-skill), prompts user if diff > 0;"
    },
    {
      "file": "本地工作目录",
      "summary": "File I/O and artifact output: Generation workflow writes to user project directory: `mkdir -p \"Project/XXX/ppt/images\"` and `cp \"<SKILL_ROOT>/assets/templ"
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 反查（换角度抓第一遍的错）：① git ls-tree -r HEAD 取全量受控文件（41 个：SKILL.md、LICENSE、README.md/en、CONTRIBUTING.md、SPONSORS.md、docs/unification-plan.md、assets/{template.html,template-swiss.html,motion.min.js,ppt-skill-showcase.png,9 张 webp}、references/ 11 份、scripts/ 3 个 mjs、.github/ 若干），逐一核对资产面；② 全仓 token 扫描（maplibre|tile|fetch\\(|api[_-]?key|API_KEY|token|secret|os\\.environ|process\\.env|child_process|playwright|npm install|npx |git fetch|git pull）逐条定位：URL 命中集中在两份模板 <head> 与 swiss-map-component.md；process/child_process 零命中；eval 类零命中；③ 读 SKILL.md 全文 632 行（分两段），核对每个脚本调用点与 SKILL.md 描述一致（validate-swiss-deck / validate-presenter-mode / check-presenter-runtime-sync 三条命令逐字存在）；④ 读 scripts/validate-swiss-deck.mjs 头部与 Playwright 加载段、check-presenter-runtime-sync.mjs 头部，确认只有 readFileSync/resolve/动态 import，无写文件、无子进程；⑤ 核对模板 seed 结构：grep SLIDES_HERE=537 行、SPEAKER_NOTES=545/555/762 行，确认『拷贝模板填空』机制为真；⑥ 读 assets/motion.min.js 首尾，确认是 jsDelivr 打包的 Motion 11.11.17（含 sourceMappingURL），非混淆载荷；⑦ 读 LICENSE 首行确认为 AGPL-3.0（与 GitHub API 一致，且与同类 MIT skill 不同，属重要提示）；⑧ 功能声明 vs 实际能力：frontmatter 宣称的 WebGL 背景、演讲者视图、观众屏同步、章节幕封、数据大字报、图片网格在 SKILL.md 与模板/脚本中均有对应实现，无夸大；⑨ gh api repos/op7418/guizang-ppt-skill 复核 stars=26343、pushed_at=2026-08-07T03:58:08Z、license AGPL-3.0；本地 git HEAD c91369c449d3 == pin c91369c449d3。",
    "second_pass": [
      {
        "item": "skill.path 定位（任务表标『待定位』）",
        "status": "ok",
        "detail": "仓库根即有 SKILL.md（git ls-tree 根层含 SKILL.md），assets/references/scripts 均位于根下同级，故 path=\".\"；全仓 SKILL.md 计数为 1，不存在第二份。"
      },
      {
        "item": "三个校验脚本『只读』结论的反例搜索",
        "status": "ok",
        "detail": "全仓 grep 未发现 writeFileSync/createWriteStream/fs.write；validate-swiss-deck.mjs 顶部为 readFileSync + createRequire + pathToFileURL，Playwright 段为 launch/newContext/close；check-presenter-runtime-sync.mjs 为 readFileSync + 字符串比对。脚本输出走 console 与 process.exit(2)。"
      },
      {
        "item": "『无凭证读取』是否漏网",
        "status": "ok",
        "detail": "api_key/API_KEY/token/secret/.env/os.environ/process.env/keychain 全仓扫描零命中。配图走 GPT-M 2.0（宿主能力）、更新走 git（用户既有凭证），skill 文本未要求读取任何密钥；MapLibre OSM 瓦片为公开无 key 服务。"
      },
      {
        "item": "Step 0 自更新：是否会自动 pull",
        "status": "ok",
        "detail": "SKILL.md 原文 '有更新时先问用户是否要更新,用户确认后再执行更新' + '不要自动更新。用户拒绝时继续使用当前版本'，且网络不可用/无 upstream/非 git 仓库时明确跳过继续流程。属用户确认型动作，非静默自更新。"
      },
      {
        "item": "CDN 依赖是否被低估（@latest 浮动版本）",
        "status": "discrepancy",
        "detail": "第一遍只记『字体/图标 CDN』；第二遍逐个 grep 模板发现 Lucide 走的是 `unpkg.com/lucide@latest`（浮动主版本，未 pin），而 Motion 是 pin 到 11.11.17 且有本地副本。已在 external_deps 与 security.reason 中显式点名该浮动风险（供应链面），并保留其余 CDN 条目。"
      },
      {
        "item": "『离线可用』宣称是否成立",
        "status": "ok",
        "detail": "Motion 有本地 assets/motion.min.js 且失败时强制 reveal `[data-anim]`（template.html 内可见 console.warn 兜底分支）；瑞士风有 body.low-power 静态模式（CSS 里 display:none 掉 canvas.bg/ascii-bg、animation/transition: none）。但字体与 Lucide 图标仍走外网——离线时字体退回系统栈/图标缺失，属『内容可读但外观退化』，SKILL.md 未把完全离线列为承诺，故不算夸大。"
      },
      {
        "item": "『S01–S22 版式锁定』是否真有约束力",
        "status": "ok",
        "detail": "SKILL.md 要求每个 <section> 写 data-layout=\"Sxx\" 并明示无 data-layout 视为未登记版式；validate-swiss-deck.mjs 以 --allow-experimental 开关区分实验版式；22 个 S 编号在 SKILL.md 表格中完整列出（S01 Index Cover … S22 Image Hero），与 layouts-swiss.md 骨架对应。"
      },
      {
        "item": "license 档位核对",
        "status": "ok",
        "detail": "第一遍未写许可；第二遍读 LICENSE 首行确认为 GNU AGPL-3.0 文本，与 gh api 的 spdx_id=AGPL-3.0 一致，已在 meta.license 与 traits 中提示（对闭源二次分发有影响）。"
      },
      {
        "item": "stars / last_push 两源比对",
        "status": "ok",
        "detail": "gh api 实时 stars=26343、pushed_at=2026-08-07T03:58:08Z；queue-100.json 快照 26343 / 2026-08-07，一致。"
      },
      {
        "item": "无法从本仓定位的部分",
        "status": "unlocatable",
        "detail": "GPT-M 2.0 配图走宿主 agent 自身的图像能力，skill 内无端点、无 SDK 调用点，因此『图片生成请求实际发往何处、是否留存』无法从本仓源码定位；Playwright 首次运行的浏览器下载行为亦属本地工具链，不在本仓。此两项不下结论。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "c91369c449d34755d320a8b81d0734000d99d1ab",
    "sha256": "81dbd0381b0986e885816f5bad32f478c17c1219ff46420465e5dada91b7cbae",
    "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/guizang-ppt.tar.gz",
    "sha256": "81dbd0381b0986e885816f5bad32f478c17c1219ff46420465e5dada91b7cbae",
    "commit": "c91369c449d34755d320a8b81d0734000d99d1ab"
  },
  "original": {
    "github": "https://github.com/op7418/guizang-ppt-skill",
    "path": "",
    "commit": "c91369c449d34755d320a8b81d0734000d99d1ab"
  }
}