{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "handdraw-style-prompter",
  "built": "2026-10-26",
  "control_level": 4,
  "control_level_label": "L4 高权限",
  "capabilities": [
    "execute_command",
    "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/build_library.py (rebuilds styles.json and gallery/index.html — writes to referenc"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: build_library.py overwrites handdraw-style-prompter/references/styles.json and handd"
    }
  ],
  "verification": {
    "method": "第二遍独立复核：① 不用第一遍结论，重列仓库全量受控文件（git ls-tree：16 个非图片文件 + 325 个图片）核对资产面与「文档声称 vs 实际资产」差异；② 对 5 个脚本做 ast import 扫描 + 实跑 resolve_reference.py，定位依赖断链；③ 逐个核对数据文件（styles.json 261 条与编号连续性、model_capabilities 条目数与取值分布、attribution 的 deceased 来源、contact_sheet_state）；④ 画廊对外引用扫描（grep http(s):// → 0 命中，全部为 ../../images/ 相对路径）；⑤ 图片覆盖实测（find 单图与 _grid.jpg 的编号范围）与 MANIFEST/SKILL.md 文本对照；⑥ 网络/凭证面反查（全仓库 grep http/fetch/requests/urllib/api_key/token → 无外发与凭证）；⑦ commit/星标对照 GitHub API 与本地 HEAD。",
    "second_pass": [
      {
        "item": "style 索引与编号连续性",
        "status": "ok",
        "detail": "styles.json 261 条，首条 001 Gemma Correll / Playful Deadpan Doodle，末条 261 OscarAI；validate_library.py 亦硬断言 [number] == 连续 001–261 且 018 必须映射 'Minimal Deadpan Dialogue Cartoon'。"
      },
      {
        "item": "画廊离线自足",
        "status": "ok",
        "detail": "gallery/index.html 中 http(s):// 字面量 0 命中，img/button data-src 全部为 ../../images/<sheet>.png 相对路径，无 CDN/字体/统计外链。"
      },
      {
        "item": "SKILL.md 的 Utilities 命令可运行性",
        "status": "discrepancy",
        "detail": "`python scripts/resolve_reference.py --model <model> --style <number>` 实跑报 ModuleNotFoundError: No module named 'style_asset_paths'（脚本把仓库根 <repo>/scripts 插入 sys.path，但该目录与模块不存在，git ls-tree 全仓库无该文件）。同一缺失还被 split_contact_sheets.py 与 validate_library.py 引用（后者另需 contact_sheet_registry）。故 SKILL.md「Utilities」5 条命令中，仅 build_library.py 与 prompt_style.py 当前可运行；这是仓库在 pin commit 上的真实缺陷，非本报告的定位问题。"
      },
      {
        "item": "模型能力清单的覆盖面",
        "status": "ok",
        "detail": "model_capabilities.json 仅 gpt-image-2 一轮清单、123 条编号条目（strong 78 / none 45）；未列编号走 resolve() 的 entry 继承 default（unknown + 传图），即保守回退。SKILL.md 第 12-19 行的三级决策与代码分支逐条对应（name+style / name+style+traits / reference-image）。"
      },
      {
        "item": "「与作者名气无关」的声明与代码一致",
        "status": "ok",
        "detail": "决策只读 name_activation/traits_activation 两个字段，代码中不存在任何依赖 attribution.json（名气/在世状态）的分支；attribution 仅被 validate_library.py 用于「deceased 必须带 source」的完整性断言。"
      },
      {
        "item": "图片资产覆盖与文档一致性",
        "status": "discrepancy",
        "detail": "实跑 find 统计：images/ 下 19 张分组拼图 + 单图 200 张（001–200 桶）+ 61 张（201–400 桶 = 201–261）+ 45 张 *_grid.jpg（编号 217–261），合计 325 个受控图片文件＝git ls-files 中 images/ 的条目数。但 MANIFEST.md 的「已收录图片」只登记 16 张拼图（止于 G_201-216.png），且仍写「images/individual/201-400/201.png–217.png：201–217 的编号单图」「风格编号覆盖：001–217」「当前无缺失编号段」，README/SKILL.md 已按 001–261 描述。判定：MANIFEST.md 为滞后文档，能力面以 261 为准。"
      },
      {
        "item": "路径可移植性",
        "status": "discrepancy",
        "detail": "SKILL.md 第 21 行把参考图根写死为 `E:\\handraw-style\\images\\individual\\{bucket}\\{number}.png`，第 37/40 行画廊链接为 `file:///E:/handraw-style/...`；这两处只在作者本机成立（本仓库实际位置为 <repo>/images/individual/...）。跨平台使用需按仓库根改写这三处。"
      },
      {
        "item": "无网络外发与凭证读取",
        "status": "ok",
        "detail": "对 5 个脚本与 SKILL.md/agents/openai.yaml 扫描 http/fetch/requests/urllib/socket/api_key/token/secret：脚本侧 0 命中；SKILL.md 唯一外部动作为宿主 MCP 打开 file:// 本地文件与把路径交给图像工具。resolve_reference 的能力数据来自本地 JSON，不需要联网查询模型能力。"
      },
      {
        "item": "会话初始化不写状态文件",
        "status": "ok",
        "detail": "SKILL.md 第 39 行原文要求用会话上下文判断是否已初始化（'not a persistent state file'）；仓库内亦无任何 state/lock 类运行时文件（仅有数据文件 contact_sheet_state.json，用于拼图排布而非会话状态）。"
      },
      {
        "item": "许可与元数据",
        "status": "ok",
        "detail": "仓库无 LICENSE 文件、GitHub API license=null —— 未声明许可（已如实记录，不推断）；stars 1855、pushed_at 2026-09-15T01:59:51Z、默认分支 master、本地 HEAD=70bf51d6b4c301805dd6c083355a2ad18db1023b 与 remote github.com/yang0/handraw-style 一致。"
      },
      {
        "item": "官方描述与实现能力核对",
        "status": "ok",
        "detail": "描述称「把 001–261 编号与主题变成双语 prompt，或在明确要求生图时按模型能力决定是否需要编号参考图」：编号范围与 styles.json 一致（261），双语 prompt 契约在 SKILL.md Output 段逐字给出，能力判定逻辑在 resolve_reference.py 与 model_capabilities.json 中实现（脚本当前不可运行属可运行性缺陷，不影响逻辑存在）。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "70bf51d6b4c301805dd6c083355a2ad18db1023b",
    "sha256": "b025e1b5b2a3616d2b766e867dbaa711648ab641c1039df43b3105861954670d",
    "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/handdraw-style-prompter.tar.gz",
    "sha256": "b025e1b5b2a3616d2b766e867dbaa711648ab641c1039df43b3105861954670d",
    "commit": "70bf51d6b4c301805dd6c083355a2ad18db1023b"
  },
  "original": {
    "github": "https://github.com/yang0/handraw-style/tree/main/handdraw-style-prompter",
    "path": "handdraw-style-prompter",
    "commit": "70bf51d6b4c301805dd6c083355a2ad18db1023b"
  }
}