{
  "schemaVersion": 1,
  "slug": "first-last-frame-file-preflight",
  "locale": "zh",
  "evidenceClass": "executed-local-fixture-not-provider-generation",
  "providerModelTest": false,
  "productionTaskRun": false,
  "runCommand": "node run-recipe.mjs --out ./my-run",
  "environment": {
    "nodeVersion": "v24.18.0",
    "ffmpeg": {
      "version": "ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers",
      "binarySha256": "a90e3db6a3fd35f6074b013f948b1aa45b31c6375489d39e572bea3f18336584"
    }
  },
  "title": "首尾帧文件预检：尺寸、比例与角色绑定",
  "description": "核对两张原创 PNG 的准确尺寸、16:9 比例、完整解码及角色 SHA-256，实际拒绝竖图、错绑与缺图。",
  "goal": "确认绑定到 first、last 的文件确实是指定且可读的同尺寸图像。本检查不证明首尾语义连续，也不验证任何提供商的首尾帧能力。",
  "preparation": [
    "准备 Node.js 与已有 FFmpeg；若不在 PATH，先将 FFMPEG_BIN 设为可执行文件绝对路径。本次夹具实际使用 FFmpeg 6.0。",
    "查看 binding.json 与 executed/inputs 中的原创 first.png、last.png，尺寸均为 320×180；另有 180×320 竖图专门用作错误输入。",
    "把角色名、文件 basename 与预期 SHA-256 一起保存，选择全新输出目录，避免旧清单悄悄指向已替换的文件。"
  ],
  "steps": [
    {
      "title": "01. 固定每个角色对应哪份文件",
      "body": "脚本创建两张小型原创 RGB 示意图并写出绑定清单。首尾图的字节与边缘标记各不相同。哈希来自实际文件，不通过上传次序或文件名包含 first 来猜测角色。"
    },
    {
      "title": "02. 同时核对画布与完整解码",
      "body": "逐项读取 PNG 签名和 IHDR 宽高，再由 FFmpeg 完整解码为一帧 RGB。两张都必须为 320×180，并符合本任务明确选定的 16:9 画布。只有头部尺寸正确，还不能证明压缩像素能解码。"
    },
    {
      "title": "03. 实跑四种不安全绑定",
      "body": "依次检查竖版尾图、交换文件名、缺少尾图及父目录路径。它们分别实际触发尺寸不匹配、哈希绑定失败、输入缺失与不安全 basename，failure-receipt.json 保留具体异常。"
    },
    {
      "title": "04. 把文件与绑定清单一起留档",
      "body": "检查 execution-receipt.json 的七项通过及脚本运行前后哈希。改成自己的上传流程时，把两张 PNG 与 binding.json 成套保存；相机、主体与首尾语义仍需独立审看。"
    }
  ],
  "acceptance": [
    "正确首尾图各完整解码为一帧 RGB。",
    "两个角色都准确为 320×180，交叉相乘验证 16:9。",
    "首尾图 SHA-256 不同，且分别匹配各自绑定文件。",
    "180×320 的竖图替换会因尺寸不一致被拒绝。",
    "把 last 文件名放入 first 但保留旧哈希，会被拒绝。",
    "缺失文件与父目录路径均失败，七项检查写入回执。"
  ],
  "troubleshooting": [
    {
      "symptom": "尾图主体正确但尺寸检查失败。",
      "change": "只调整其实际像素画布到选定尺寸，重新导出并获取新哈希。改文件名不能改变竖图尺寸。"
    },
    {
      "symptom": "两份文件上传时顺序弄反。",
      "change": "更正角色到 basename 的映射，再从所选文件重新生成预期哈希并复核绑定。"
    },
    {
      "symptom": "文件头正常，但解码中途失败。",
      "change": "只把受损文件换成完整本地副本，再跑完整解码；不以 IHDR 宽高代替像素可读性。"
    }
  ],
  "ending": "这份清单记录文件就绪情况，不代表已生成首尾过渡、已兼容某个接口或已保留两端视觉状态。",
  "assetCaption": "原创首尾 PNG 练习输入、竖图失败夹具与绑定示意图；全部是本地输入，不是模型生成结果。"
}
